劍指offer 面試題3 陣列中重複的數字

2021-08-19 02:12:12 字數 2708 閱讀 3604

找出陣列中重複的數字

在乙個長度為n的陣列裡的所有數字都在0~n-1的範圍內。陣列中某些數字時重複的,但不知道有幾個數字重複了,也不知道每個數字重複了記此。請找出陣列中任意乙個重複的數字。例如:如果輸入長度為7的數字,那麼對應的輸出是重複的數字2或3。

思路是:將下標為i的元素與下標為a[i]的元素比較,相等就說明有重複數字返回1,不相等就交換,直到交換到a[i]=i,每個數字經過兩次交換就能回到自己的位置。如果有重複的數字出現,就說明有乙個數字不在他應該在的地方,所以比較一次就能判斷出來。大致過程如下圖所示。

此時,陣列的元素已經有序了,當i=4時,此時該值是3,按照我們的思路,就會去與下標為3的值進行比較,發現相等了,就返回1。

首先,編寫測試用例:

陣列中滿足0~n-1,有重複的數字

陣列中沒有重複的數字

陣列不滿足0~n-1

空指標

int arr1=;//測試用例1:0~n-1中有重複的數字

int len=sizeof(arr1)/sizeof(arr1[0]);

duplicate(arr1,len,&dup);//dup輸出性引數

printf("the num is %d\n",dup);

int arr2=;//測試用例2:無重複數字

len=sizeof(arr2)/sizeof(arr2[0]);

int ret=duplicate(arr2,len,&dup);

printf("ret expect 0,actual is %d\n",ret);

int arr3=;//測試用例3:包含0~n-1之外的數字

len=sizeof(arr3)/sizeof(arr3[0]);

int ret1=duplicate(arr3,len,&dup);

printf("ret expect 0,actual is %d\n",ret1);

// //測試用例4:空指標

int ret2 = duplicate(null,len,&dup);

printf("ret expect 0,actual is %d\n",ret2);

**如下:

int duplicate(int arr,int

len,int *dup)

int i=0;

for(i=0;i

}for(i=0;i

//swap

int tmp=arr[i];

arr[i]=arr[tmp];

arr[tmp]=tmp;}}

return

0;}

在做這道題時,出現了乙個問題就是:在編寫交換**時,寫成了:

int

tmp=arr[i];

arr[i]=arr[arr[i]];

arr[arr[i]]=tmp;

這個**起初一看**好像是沒有什麼錯誤,其實問題很大。。。arr[i]實際已經被改了後,在取arr[arr[i]]時,就已經不是原來要取的那個數字了,所以這個細節以後一定要注意!!!!!

不修改陣列,找出陣列中重複的數字

我的思路是:創造乙個新的陣列,將原來陣列中的每個數字都複製到新陣列中它應該取得地方,這個應該去的地方實際上是:它的值就是它的下標位置。在複製的過程中,一旦發現你要複製的這個位置已經有人佔了,那麼說明這個數字就重複了。但是這種方法空間複雜度需要o(n).

測試用例:依然分為三部分:

int main()

;//測試用例:滿足0~n-1

int len1=sizeof(a1)/sizeof(a1[0]);

int ret=getduplocation(a1,len1);

printf("ret expect 1,actual %d\n",ret);

int a2=;//測試用例:不包含重複數字

int len2=sizeof(a2)/sizeof(a2[0]);

ret=getduplocation(a2,len2);

printf("ret expect 0,actual %d\n",ret);

int a3=;//測試用例:不在0~n-1

int len3=sizeof(a3)/sizeof(a3[0]);

ret=getduplocation(a3,len3);

printf("ret expect 0,actual %d\n",ret);

//無效測試用例

ret=getduplocation(null,len2);

printf("ret expect -1,actual %d\n",ret);

return

0;}

**如下:

int getduplocation(const

int* a,int

len)

int new_arr[10];

int i=0;

for(i=0;i

}for(i=0;i

new_arr[a[i]]=a[i];

}return

0;}

這道題應該有更好的解題思路,等學習了再來更新。

劍指offer 面試題3

思路 從左下角或者右上角開始比較 簡單版本 查詢方式從右上角開始查詢 如果當前元素大於target,左移一位繼續查詢 如果當前元素小於target,下移一位繼續查詢 進行了簡單的修改,可以判定輸入型別為字元的情況 查詢方式從左下角開始查詢 如果當前元素大於target,上移一位繼續查詢 如果當前元素...

劍指offer面試題3

前言 從最近的比賽中,真的可以看出來自己做題目太少了,一些常見的演算法,思路都不怎麼會,接下來要好好努力了 分析 書中給的分析思路很好,要解決乙個複雜的問題,最有效的方法就是從乙個具體的問題入手,這道題就可以舉例子,查詢7這個元素,首先從右上角開始,9比7大,所以9所在的列不會有,查詢8,比7大,所...

《劍指offer》陣列相關面試題

在乙個長度為n的陣列裡所有數字都在0 n 1範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複,也不知道重複了幾次,請找出陣列中任意乙個重複的數字。例如,長度為7的陣列,那麼對應的輸出應該是重複的數字2或者3.思路 重排這個陣列,從頭到尾依次掃瞄這個陣列中的每個數字。掃到下標為i的數字m時 首先...