1. 程式人生 > >面試題56 - I. 陣列中數字出現的次數

面試題56 - I. 陣列中數字出現的次數

#### [面試題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 ```