乙個整型陣列裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。
知識點回顧:
思路:python實現:
// an highlighted block
class
solution
: # 返回[a,b] 其中ab是出現一次的兩個數字
(self, array)
: # write code here
tmp =
for a in array:
if a in tmp:
tmp.
remove
(a)else
: tmp.
(a)return tmp
python實現2:
// an highlighted block
from collections import counter
class
solution
: # 返回[a,b] 其中ab是出現一次的兩個數字
(self, array)
: # write code here
return
list
(self.
dc(array,0,
len(array)-1
))def dc
(self, array, start, end)
: res =
set(
)if start > end:
return res
if start == end:
return
set(array[start:end+1]
)
spl =
(start+end)/2
s1 = self.
dc(array, start, spl)
s2 = self.
dc(array, spl+
1, end)
return s1.
union
(s2)
.difference
(s1.
intersection
(s2)
)
python實現3(異或)
(1)對於出現兩次的元素,使用「異或」操作後結果肯定為0,那麼我們就可以遍歷一遍陣列,對所有元素使用異或操作,那麼得到的結果就是兩個出現一次的元素的異或結果。
(2)因為這兩個元素不相等,所以異或的結果肯定不是0,也就是可以再異或的結果中找到1位不為0的位,例如異或結果的最後一位不為0。
(3)這樣我們就可以最後一位將原陣列元素分為兩組,一組該位全為1,另一組該位全為0。
(4)再次遍歷原陣列,最後一位為0的一起異或,最後一位為1的一起異或,兩組異或的結果分別對應著兩個結果。
// an highlighted block
class
solution
:(self, array)
:if not array:
return
# 對array中的數字進行異或運算
tmp =
0for i in array:
tmp ^= i
# 獲取tmp中最低位1的位置
idx =
0while
(tmp &1)
==0: tmp >>=
1 idx +=
1 a = b =
0for i in array:
if self.
isbit
(i, idx)
: a ^= i
else
: b ^= i
return
[a, b]
def isbit
(self, num, idx)
:"""
判斷num的二進位制從低到高idx位是不是1
:param num: 數字
:param idx: 二進位制從低到高位置
:return
: num的idx位是否為1
""" num = num >> idx
return num &
1
陣列中只出現一次
首先看看題目要求 陣列a中,除了某乙個數字 x之外,其他數字都出現了三次,而 x出現了一次。請給出最快的方法找到x。這個題目非常有意思,在本人部落格中有 位操作基礎篇之位操作全面總結 這篇文章介紹了使用位操作的異或來解決 陣列中其他數字出現二次,而x出現一次,找出x。有 這邊文章介紹了分組異或的方法...
陣列中只出現一次的數字
何海濤 劍指offer 名企面試官精講典型程式設計題 九度oj 題目描述 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。輸入 每個測試案例包括兩行 第一行包含乙個整數n,表示陣列大小。2 n 10 6。第二行包含n個整數,表示陣列元素,元素均為int。輸...
陣列中只出現一次的數字
來自劍指offer 分析 如果整型陣列中只有乙個數字出現一次,我們只需將陣列中每個元素依次做異或操作,最終就得到了只出現一次的數字。因為自己與自己異或後,結果為0.現在,陣列中有兩個數字只出現一次,上述一次遍歷後將所有元素異或得不到那兩個數字。因此,我們試著將原陣列分成兩個子陣列,使每個子陣列中分別...