找出陣列中重複的數字
在乙個長度為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時 首先...