先驗知識
給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
這是一道非常經典的題目,用 異或 可以輕鬆解決 —— 所有的數字異或起來,就是答案。
為什麼呢?
我們先來看下異或的性質(數學裡異或的符號是 ⊕):
我們可以根據 交換律、 結合律 將相同的數字優先兩兩進行異或運算。此時根據 歸零率 ,每兩個相同的數字都變成了 0,再根據 恒等率 ,把式子裡所有的 0 去了,此時就只剩下只出現一次的那個數了!
0# 所有數字異或的結果
a =0 b =
0for n in nums:
ret ^
= n # 找到第一位不是0的
h =1while
(ret & h ==0)
: h <<=1
for n in nums:
# 根據該位是否為0將其分為兩組
if(h & n ==0)
: a ^
= n else
: b ^
= n return
[a, b]
deffinderrornums
(self, nums: list[
int])-
> list[
int]
: nums =[0
]+ nums
idx =
for i in
range
(len
(nums)):
a, b = self.singlenumbers(nums + idx)
for num in nums:
if a == num:
return
[a, b]
return
[b, a]
260. 只出現一次的數字 3
(就是本題)
題目大意是除了兩個數字出現一次,其他都出現了兩次,讓我們找到這個兩個數。
我們進行一次全員異或操作,得到的結果就是那兩個只出現一次的不同的數字的異或結果。
我們剛才講了異或的規律中有乙個 任何數和本身異或則為0, 因此我們的思路是能不能將這兩個不同的數字分成兩組 a 和 b。
分組需要滿足兩個條件.
兩個獨特的的數字分成不同組
相同的數字分成相同組
這樣每一組的資料進行異或即可得到那兩個數字。
問題的關鍵點是我們怎麼進行分組呢?
由於異或的性質是,同一位相同則為 0,不同則為 1
. 我們將所有數字異或的結果一定不是 0,也就是說至少有一位是 1
.我們隨便取乙個,分組的依據就來了, 就是你取的那一位是 0 分成 1 組,那一位是 1 的分成一組。
這樣肯定能保證 2
. 相同的數字分成相同組,不同的數字會被分成不同組麼。 很明顯當然可以, 因此我們選擇是 1,也就是
說 兩個獨特的的數字 在那一位一定是不同的,因此兩個獨特元素一定會被分成不同組。
```python
class
solution
:def
singlenumbers
(self, nums: list[
int])-
> list[
int]
: ret =
0# 所有數字異或的結果
a =0 b =
0for n in nums:
ret ^
= n # 找到第一位不是0的
h =1while
(ret & h ==0)
: h <<=1
for n in nums:
# 根據該位是否為0將其分為兩組
if(h & n ==0)
: a ^
= n else
: b ^
= n return
[a, b]
leetcode 陣列中數字出現的次數
乙個整型陣列 nums 裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o n 空間複雜度是o 1 1 位運算,但是不具有一般性,如果把題目改一改就不行了 2 雜湊表,具有一般性,可以檢視出現任意次數的數字,但是犧牲了空間,這裡題目給出2 define m...
統計數字出現次數
description 某次科研調查時得到了n個自然數,每個數均不超過1500000000 1.5 10 9 已知不相同的數不超過10000個,現在需要統計這些自然數各自出現的次數,並按照自然數從小到大的順序輸出統計結果。input 包含多個測試資料,每個包含n 1行 第1行是整數n,表示自然數的個...
陣列中數字出現的次數
題目 乙個整型陣列 nums 裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o n 空間複雜度是o 1 示例 1 輸入 nums 4,1,4,6 輸出 1,6 或 6,1 示例 2 輸入 nums 1,2,10,4,1,4,3,3 輸出 2,10 或 1...