從網(wǎng)上找的大神的解法锭部,略難理解
題目描述:
給定一個非空整數(shù)數(shù)組,除了某個元素只出現(xiàn)一次以外面褐,其余每個元素均出現(xiàn)了三次拌禾。找出那個只出現(xiàn)了一次的元素。
說明:
你的算法應(yīng)該具有線性時間復(fù)雜度展哭。 你可以不使用額外空間來實現(xiàn)嗎湃窍?
示例 1:
輸入:[2,2,3,2]輸出:3
示例?2:
輸入:[0,1,0,1,0,1,99]輸出:99
解題如下:
public class Solution1 {
public static void main(String[] args) {
Solution1 solution1 =new Solution1();
int[] nums = {5,1,5,1,5,1,99};
System.out.println(solution1.singleNumber(nums));
}
/*
如果是出現(xiàn)兩次的話,用一個bit就可以
比如 b摄杂,初始為0
當(dāng)5第1次出現(xiàn)時坝咐, b=5
當(dāng)5第2次出現(xiàn)是, b清空為0析恢,表示b可以去處理其他數(shù)字了
所以墨坚,最后 如果 b !=0的話,b記錄的就是只出現(xiàn)了一次的那個數(shù)字
->公式就是 b = b xor i? 或者 b = b^i
那么映挂,如果是三次的話泽篮,香濃定理,需要用2bits進行記錄
當(dāng)5第一次出現(xiàn)的時候柑船,b = 5, a=0,? b記錄這個數(shù)字
當(dāng)5第二次出現(xiàn)的時候帽撑,b = 0, a=5, a記錄了這個數(shù)字
當(dāng)5第三次出現(xiàn)的時候鞍时,b = 0, a=0亏拉, 都清空了扣蜻,可以去處理其他數(shù)字了
所以,如果有某個數(shù)字出現(xiàn)了1次及塘,就存在b中莽使,出現(xiàn)了兩次,就存在a中笙僚,所以返回 a|b
公式方面 芳肌,上面兩次的時候,b清空的公式是 b = b xor i
而第三次時肋层,b要等于零亿笤,而這時a是True,所以再 & 一個a的非就可以栋猖,b = b xor & ~a
-> b = b xor i & ~ a
a = a xor i & ~b
**/
? ? public int singleNumber(int[] nums) {
int a =0;
int b =0;
for (int in : nums) {
b = (b ^ in) & ~a;
a = (a ^ in) & ~b;
}
return a | b;
}
}