給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。
說明:
你的算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例 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;
}
}