**數字的範圍被陣列長度所約束。這意味著如果乙個陣列中沒有重複的數字,將其從小到大排序,得到的陣列將會是乙個陣列下標和值相同的陣列。如這樣的:
題目暫時不需要將所有重複的數字都給列出來,所以只要檢測到乙個重複的數字,將其輸出即可。
如果將乙個陣列按從小到大的順序排序,一定可以完成任務,但是我們不需要將整個陣列排序,只需要在排序的過程中發現第乙個重複的數就可以了。
設定i = 0從陣列的下標為i的元素開始檢測,如果 i = nums.length,則跳到第5步。
如果當前元素的值和陣列下標相同,意味著當前下標的值已經找到,可以向後檢索,i++,回到第2步。
如果當前元素的值和陣列下標不同,將當前的值與當前的值作為陣列下標的值比較,若不同則交換(如nums[0]=3,則將nums[0]與nums[3]的值交換)並返回第2步。若相同則將當前值返回,因為已經出現了重複的元素,過程全部結束。
到達此步,說明整個陣列已經整理完畢,並且沒有出現重複的數字,所以返回-1;
選題目中給的用例就可以理解這個思想:
陣列取下標01
2345
6nums
23
1025
3nums
13
2025
3nums
13202
53nums
31202
53nums
31
20253
nums
01
23253
nums
0123
253nums
01232
53nums01
2325
3nums01
23253
nums01
23
25
3檢查nums[0],值為2,將nums[0]=2與nums[2]=1比較,值不同,交換。
檢查nums[0],值為1,將nums[0]=1與nums[1]=3比較,值不同,交換。
檢查nums[0],值為3,將nums[0]=3與nums[3]=0比較,值不同,交換。
此時nums[0]=0,i++,檢查下乙個。
檢查nums[1],值為1,i++,檢查下乙個。
檢查nums[2],值為2,i++,檢查下乙個。
檢查nums[3],值為3,i++,檢查下乙個。
檢查nums[4],值為2,將nums[4]=2與nums[2]=2比較,值相同,出現重複值,返回nums[4]或者nums[2]均可(因為值相同)
package q01;
public
class
question01
/** * 判斷numbers陣列中是否存在重複出現的數,若有則存入duplication 返回true,否則返回false
* @param nums 待檢測陣列
* @param length numbers陣列的長度
* @param duplication 存放重複出現的數的陣列
* @return
*/public int duplicate
(int[
] nums)
int length = nums.length;
//根據題目要求,陣列中存放的數是在0~n-1之間的,若有數不在此範圍,應該return -1,表示異常;
for(int i =
0; i < nums.length; i++)}
//依次檢索陣列中的元素
for(int i =
0; i < nums.length; i++
)//若不同,則交換
int temp = nums[i]
; nums[i]
= nums[nums[i]];
//此行注釋掉的**是我一開始寫的時候犯的低階錯誤,寫出來提醒一下各位。
//因為此時的nums[i]已經發生了改變,不能再用nums[nums[i]]去呼叫了,否則會出現死迴圈。
//nums[nums[i]] = temp;
nums[temp]
= temp;}}
//返回預設的結果0,表示沒有重複
return0;
}}
package q01;
public
class
;//陣列中存在數大於array.length-1,檢測應為-1
int[
] nums3 =
;//符合題目要求的陣列,應當返回0,
int[
] nums4 =
;//符合題目要求的陣列,應當返回2
劍指offer筆記
對於這道題來說,書上的和leetcode上的是不一樣的。在leetcode上,是一位陣列中判斷是否有重複數字,有的話任意返回乙個就行。這個思路也有兩個 1.先用乙個排序如快排o nlogn 然後就判斷相鄰元素是否相等,若相等直接返回即可。2.用乙個集合set,遍歷陣列放進去,因為集合有唯一性,若哪個...
劍指offer 醜數
把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 參考程式設計師面試金典 偽 如下 1 初始化array和佇列 q2 q3 q5 2 將1插入array 3 分別將1 2...
劍指Offer 醜數
我們把只包含因子 2 3 和 5 的數稱作醜數 ugly number 求按從小 到大的順序的第 1500 個醜數。例如 6 8都是醜數,但 14 不是,它包含因子 7。習慣上我們把 1當做第乙個醜數。解法一 逐一判斷是否是醜數,簡單但是不夠高效 數字n是數字m的因子說明m n 0。醜數的因子只有2...