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