3 22 劍指offer 陣列中只出現一次的數字

2021-09-13 11:03:56 字數 1329 閱讀 4947

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。

要求空間複雜度為o(1),時間複雜度為o(n)。

簡化問題,如果只有乙個數隻出現一次,其他數字都出現兩次,那麼利用異或運算的性質。對陣列中每個元素異或,相同的兩個數異或為0,剩下的就是出現1次的數字。

但是現在有兩個只出現1次的數字,我們把所有數字異或,得到結果肯定不為0;找到某一位不為0,利用這一位對所有數字分組,為1的分到一組,為0的另一組,這樣相同的數字,每一位都相等,會被分到同一組,而只出現一次的兩個數會被分到不同的組(異或等於1),就化簡為上面的問題;最後分別對兩組數異或所有值,得到的就是所求的兩個數。

對所有數異或,python中異或符號為』^』

找到異或值不為0的位置,python中bin()返回陣列的字串二進位制,前面還有ob…,多出來兩個字元,所以這裡trick是從後往前找1,記錄位置是倒數第幾個數。

對陣列中所有數,按二進位制位置是否為1,分為兩個陣列。取位置時使用-index,表示取倒數第幾個位置。

分別對兩組數異或所有值,得到的就是所求的兩個數。

def

(array):if

len(array)==0

:return

xor =

0# 初始化為0,0異或1等於1,0異或0等於0,不改變值

for i in

range

(len

(array)):

xor = xor ^ array[i]

index =-1

count =

1# print(bin(xor)) #0b10

s =bin(xor)

for j in

range

(len

(s)-1,

-1,-

1):if s[j]

=='1'

: index = count

break

count +=

1 num1 =

num2 =

for k in

range

(len

(array)):

ifbin

(array[k])[

-index]

=='1':)

else:)

a =0 b =

0for i in num1:

a = i ^ a

for j in num2:

b = j ^ b

return

sorted

([a,b]

)

劍指offer 陣列

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

劍指offer 陣列

public class 03 陣列中的重複數字 swap number,number i i return 1 交換 public void swap int number,int i,int j public class 03 陣列中的重複數字 return 1 public intfindre...

劍指offer 陣列

問題描述 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。function find target,array return false 問題描述 在乙個長度...