乙個整型陣列裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。
要求空間複雜度為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 問題描述 在乙個長度...