劍指offer 學習記錄 陣列中的重複的數字

2021-10-12 02:49:47 字數 1169 閱讀 8432

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

1. 陣列長度為 n

2. 陣列中的數字範圍 0 ~ n-1

3. 陣列中有 重複 元素

4. 找到其中的 任意重複元素

使用雜湊表(hash),順序掃瞄原陣列的元素,並將每個元素存入雜湊表中,一但遇到重複的元素,那麼雜湊表可以以o(1)時間複雜度判斷出表中已有該元素。

**如下:

public static

intduplicate3

(int

numbers)

//無重複元素返回-1

return-1

;}

通過將陣列排序後,重複元素必定相鄰,那麼再次遍歷陣列就可以了

這是劍指offer書上的方法

利用了:陣列長度為 n , 且陣列中的數為 0 ~ n-1 的特點

因為原陣列若不存在重複元素,且滿足以上條件,那麼 numbers[i] 滿足滿足numbers[i] = i 。所以只要判斷當前 i 位置的值 是否等於 i 即可。

偽**:

1. 當 遍歷至 i 位置時, 比較 numbers[ i ] == i ?

2. 若 numbers[ i ] == i 遍歷下乙個元素;

3. 若 numbers [ i ] != i ,則將他與 numbers[ numbers[ i ] ] 比較,若相等則找到乙個重複元素

4. 若numbers[ numbers[ i ] ] != numbers[ i ] , 交換第 i 個數 與 第 numbers [ i ] 個數

**如下(示例):

public static

intduplicate

(int

numbers)

for(

int i =

0; i < numbers.length; i++)}

return-1

;}

一開始只是想到了,雜湊表方法,和陣列排序方法

書中利用到了陣列中元素的特點,從而降低了 時間複雜度,並且並沒有使用額外的空間。

劍指offer學習記錄

原碼 機器碼 反碼 除符號位,各位取反 補碼 反碼加一 此時沒有符號位的概念,即符號位也參與運算 例子 於是補碼的出現,解決了0的符號以及兩個編碼的問題 1 1 1 1 0000 0001 原 1000 0001 原 0000 0001 補 1111 1111 補 0000 0000 補 0000 ...

記錄劍指offer

1.四種與型別轉換相關的關鍵字 p23 type conversions 2.單例模式設計 p32 todo 單例模式設計 在真實的面試中有被問到過 餓漢式 多執行緒安全 餓漢式 在定義例項的時候就去new物件 以空間換時間 class csingleton private class garbag...

劍指offer 陣列

資料是最簡單的資料結構,它佔據一塊連續的記憶體並按照順序儲存資料。建立陣列時,首先指點陣列的容量大小,然後根據大小分配記憶體。缺點 空間效率不高。經常有空閒的區域滅有得到充分利用。優點 時間效率很高。可以根據時間效率高的特點,來實現簡單的雜湊表 把陣列的下標設為雜湊表的鍵值,陣列中的每乙個數字設為雜...