LeetCode 137. Single Number II

Given a non-empty array of integers, every element appears three times except for one, which appears exactly once. Find that single one.面試

Note:數組

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?app

Example 1:spa

Input: [2,2,3,2]
Output: 3

Example 2:code

Input: [0,1,0,1,0,1,99]
Output: 99
 
題目很簡單就是數組中全部的數字都出現三次,只有一個數字出現一次,在O(n)的時間複雜度和O(1)的空間複雜度找出這個惟一出現一次的數。
 
其實個人第一反應是用一個數組記錄每個二進制位出現1的個數,若是不能被3整除,證實所求的數字在該二進制位爲1。
 
思路沒問題,可是…………
 & 

去!你!妹!哦!blog

 
相信你們都作過一道面試題,數組中全部的數字都出現兩次,只有一個數字出現一次,在O(n)的時間複雜度和O(1)的空間複雜度找出這個惟一出現一次的數。
 
答案很簡單,利用異或的性質,求全部的數字異或和,就是答案。
 
 
二進制有兩個狀態,0 和 1 ,恰好能夠對應該二進制位 1 出現的次數 % 2 ,若是 %2 = 1 就是咱們要求的。
 
那若是是出現三次,咱們想知道的是一位出現 1 的次數 %3 = 1 的位置。而 %3 爲出現 0 1 2 很明顯一個二進制位是不夠用的,只要用兩個二進制位就行了。假設這兩個數是 a 和 b
 
ab
00 -->  0
01  -->  1
10  -->  2
 
a 表示 第二位 b 表示第一位
 
可是,這樣確定不能簡單經過異或來計算了。咱們假設有一種運算爲@
 

 

這樣呢 咱們只須要
for x: nums
    ab = ab @ x

就能夠啦~three

 

至於 @ 這個符號具體該怎麼計算啊=。=要經過位運算實現啊(硬湊仍是能湊出來的。。。可意會不可言傳。。。咳。。。element

[a, b] = [a ^ ((a | b) & x), (~a) & (b ^ x)]

 

完整代碼:it

var singleNumber = function(nums) {
    let a = 0, b = 0;
    for (let x of nums) {
        [a, b] = [a ^ ((a | b) & x), (~a) & (b ^ x)];
    }
    return b;
};
相關文章
相關標籤/搜索