笔试算法题(28):删除乱序链表中的重复项 找出已经排好序的两个数组中的相同项...
生活随笔
收集整理的這篇文章主要介紹了
笔试算法题(28):删除乱序链表中的重复项 找出已经排好序的两个数组中的相同项...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
出題:給定一個亂序鏈表,節點值為ASCII字符,但是其中有重復項,要求去除重復項并保證不改變剩余項的原有順序;
分析:創建一個256(2^8)大小的bool數組,初始化為false,順序讀取鏈表,將字母對應位置為false的重新標記為true并保留節點,將字母對 應位置為true的保持并刪除節點;時間復雜度為O(N),空間復雜度為常量。注意刪除節點和不刪除節點的情況下,pre和cur的移動操作不相同;
解題:
1 struct Node { 2 char value; 3 Node* next; 4 }; 5 void DeleteDup(Node *head) { 6 if(head==NULL) { 7 printf("\nthe list is NULL"); 8 return; 9 } 10 11 Node *pre=NULL, *cur=head; 12 /** 13 * 設置一個256的bool數組記錄char是否 14 * 已經出現 15 * */ 16 bool haveChar[256]; 17 for(int i=0;i<256;i++) 18 haveChar[i]=false; 19 /** 20 * 如果haveChar對應為true,說明當前節點 21 * 的值已經出現過,則進行刪除 22 * 如果haveChar對應為false,說明當前節點 23 * 的值第一次出現,則將其設置為true 24 * */ 25 while(cur!=NULL) { 26 /** 27 * 注意刪除節點的情況和不刪除節點的情況 28 * pre和cur的需要不同的處理 29 * */ 30 if(!haveChar[(cur->value)-'0']) { 31 haveChar[(cur->value)-'0']=true; 32 pre=cur; 33 cur=cur->next; 34 } 35 else { 36 pre->next=cur->next; 37 delete cur; 38 cur=pre->next; 39 } 40 } 41 } 42 int main() { 43 Node *a1=new Node();a1->value='a'; 44 Node *a2=new Node();a2->value='d'; 45 Node *a3=new Node();a3->value='s'; 46 Node *a4=new Node();a4->value='d'; 47 48 a1->next=a2;a2->next=a3; 49 a3->next=a4;a4->next=NULL; 50 51 DeleteDup(a1); 52 53 Node *temp=a1; 54 while(temp!=NULL) { 55 printf("\n%c",temp->value); 56 temp=temp->next; 57 } 58 return 0; 59 }?
出題:給定兩個已排序的數組,要求找出共同的元素;
分析:
- 如果兩個數組大小接近,則分別使用指針first和second遍歷兩個序列,由于數組已經排序,所以遍歷過的元素不會再次訪問,所以時間復雜度為O(M+N);
- 如果兩個數組大小差距較大,則在針對小數組中的每個元素在大數組中使用二分查找(每處理一個元素之后,大數組的范圍都可以調整到上一個元素的后面),時間復雜度為O(NlogM),N足夠小(M>N^2);
解題:
1 /** 2 * 時間復雜度O(M+N) 3 * */ 4 void FindCommonInt1(int *first, int fl, int *second, int sl) { 5 int ft=0, st=0; 6 while (ft<fl && st<sl) { 7 if(first[ft]>second[st]) { 8 st++; 9 } else if(first[ft]<second[st]) { 10 ft++; 11 } else { 12 printf("\n%d",first[ft]); 13 ft++;st++; 14 } 15 } 16 } 17 /** 18 * 時間復雜度小于O(NlogM),其中M不斷變小 19 * */ 20 void FindCommonInt2(int *first, int fl, int *second, int sl) { 21 int start=0, end=fl-1; 22 int s,e,m; 23 for(int i=0;i<sl;i++) { 24 s=start;e=end; 25 while(s<=e) { 26 m=(s+e)/2; 27 if(first[m]>second[i]) { 28 e=m-1; 29 } else if(first[m]<second[i]) { 30 s=m+1; 31 } else { 32 printf("\n%d",first[m]); 33 start=m+1; 34 break; 35 } 36 } 37 } 38 } 39 int main() { 40 int first[]={1,2,3,4,5,6,10,11,12}; 41 int second[]={1,4,9,10}; 42 FindCommonInt2(first, 9, second, 4); 43 return 0; 44 }?
轉載于:https://www.cnblogs.com/leo-chen-2014/p/3747209.html
總結
以上是生活随笔為你收集整理的笔试算法题(28):删除乱序链表中的重复项 找出已经排好序的两个数组中的相同项...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java记录log信息
- 下一篇: 内置类型存储空间(32位机参考)