1. 程式人生 > >面試寶典-面試題3.1:數組中的重復數字

面試寶典-面試題3.1:數組中的重復數字

ber 個數 cout scan while visit urn 面試 string

一、題意:一個數組中任意一個重復的數字

二、思路:

  1.因為題中給的數字大小範圍在0~n-1,因此可以直接用一個數據來記錄數字是否重復出現過。時間復雜度為O(n),空間復雜度也為O(n);

  2.先給數組排序,然後依次便利。時間復雜度為O(nlogn);

  3.利用下標和對應數字的關系對數組進行重排,這樣時間復雜度依然為O(n),但是空間復雜度為O(1);

三、代碼:

技術分享圖片
 1 #include"iostream"
 2 #include"stdio.h"
 3 #include"string.h"
 4 using namespace std;
 5 
 6 const int MAXN=100000
; 7 8 int num[MAXN]; 9 int visited[MAXN]; 10 11 int GetRepeat1(int n) 12 { 13 int i; 14 for(i=0;i<n;i++) 15 { 16 if(!visited[num[i]]) 17 visited[num[i]]=1; 18 else 19 return num[i]; 20 } 21 return -1; 22 } 23 24 int GetRepeat2(int n)
25 { 26 int i=0,temp; 27 while(i<n) 28 { 29 if(num[i]==i) i++; 30 else if(num[i]==num[num[i]]) return num[i]; 31 else 32 { 33 temp=num[i]; 34 num[i]=num[temp]; 35 num[temp]=temp; 36 } 37 } 38 return -1;
39 } 40 41 int main() 42 { 43 int n; 44 while(scanf("%d",&n)==1) 45 { 46 //可加入判斷,判斷n是否小於1 47 for(int i=0;i<n;i++) 48 cin>>num[i];//可加入判斷,判斷輸入的數是否在0~n-1之間 49 memset(visited,0,sizeof(visited)); 50 int res=GetRepeat1(n); 51 if(res!=-1) 52 cout<<"test for function1-the one of repeat number is: "<<res<<endl; 53 else 54 cout<<"no repeat number"<<endl; 55 res=GetRepeat2(n); 56 if(res!=-1) 57 cout<<"test for function2-the one of repeat number is: "<<res<<endl; 58 else 59 cout<<"no repeat number"<<endl; 60 } 61 }
View Code

面試寶典-面試題3.1:數組中的重復數字