劍指OFFER筆記 03 1 尋找陣列中重複的數字

2021-10-06 15:11:01 字數 3731 閱讀 8425

**數字的範圍被陣列長度所約束。這意味著如果乙個陣列中沒有重複的數字,將其從小到大排序,得到的陣列將會是乙個陣列下標和值相同的陣列。如這樣的:

題目暫時不需要將所有重複的數字都給列出來,所以只要檢測到乙個重複的數字,將其輸出即可。

如果將乙個陣列按從小到大的順序排序,一定可以完成任務,但是我們不需要將整個陣列排序,只需要在排序的過程中發現第乙個重複的數就可以了。

設定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]=2nums[2]=1比較,值不同,交換。

檢查nums[0],值為1,將nums[0]=1nums[1]=3比較,值不同,交換。

檢查nums[0],值為3,將nums[0]=3nums[3]=0比較,值不同,交換。

此時nums[0]=0,i++,檢查下乙個。

檢查nums[1],值為1,i++,檢查下乙個。

檢查nums[2],值為2,i++,檢查下乙個。

檢查nums[3],值為3,i++,檢查下乙個。

檢查nums[4],值為2,將nums[4]=2nums[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...