面試題56 - I. 陣列中數字出現的次數
阿新 • • 發佈:2020-04-28
#### [面試題56 - I. 陣列中數字出現的次數](https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/)
一個整型陣列 `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] 或 [10,2]
```
**思路**
相同數的異或結果為0。題目中有兩個數(a,b)只出現一次,其餘的數出現了兩次,如果將陣列全部進行一次 異或 得到的結果為 a和b 的異或結果。
如果只有一個數出現 1 次,其餘的數出現兩次會怎樣?異或結果就是該數。所以我們嘗試把陣列分為兩組,a和b 在不同的組分別進行異或就 ok了。
- 如何分組?
```
num1: 101110 110 1111
num2: 111110 001 1001
mask: 010000 001 0010
```
在異或結果中任選一位 1 ,對原資料進行與操作,就能將兩個只出現一次的數分到不同陣列。
python
```
class Solution:
def singleNumbers(self, nums: List[int]) -> List[int]:
if nums is None:
return []
xor = 0
for num in nums:
xor ^= num #兩個只出現一次數的異或結果
mask = 1
while (mask&xor)==0:
mask <<= 1 #選擇一位 1 作為mask 進行劃分
a,b = 0,0
for num in nums:
if (num & mask)==0: #劃分
a ^= num
else:
b ^= num
return a,b
```