137. 只出現一次的數字 II

給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。

說明:

你的算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

示例 1:

輸入: [2,2,3,2]
輸出: 3

示例 2:

輸入: [0,1,0,1,0,1,99]
輸出: 99

Review:

上一個題用了異或運算來抵消相同的兩個數

但是並不適用於奇數操作,三個數的怎麼辦呢?

 00 (+) 1 = 01

01 (+) 1 = 10

10 (+) 1 = 00 ( mod 3)

 如何理解呢

 設計一個電路 實現三種狀態變換 00 -> 01 -> 10 -> 00

需要兩個變量 a,b分別代表兩位二進制的兩位

            a ^= num & ~b;
            b ^= num & ~a;

第一個數,此時a,b都爲0, num和非b做與運算後與a異或, 得到a爲1,由於a爲1,計算的b爲0

第二個數 此時a,b分別爲1,0, 由於a本身爲1,計算後爲0, 而此時b計算爲1

第三個數 兩個則都會計算爲0

其實也可以寫成這樣比較容易理解:

a ^= num ^ b;
b ^= num ^ a;

但是這樣會干擾其他數據


Code:

class Solution {
    public int singleNumber(int[] nums) {
        int c1 = 0, c2 = 0;
        for (int num : nums) {
            c1 ^= num & ~c2;
            c2 ^= num & ~c1;
        }
        return c1;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章