只出现一次的数字Ⅱ
// 较好理解的方法,用 Set 去重
class Solution{
public int singleNumber(int[] nums) {
HashSet<Long> set = new HashSet<>();
long arraySum = 0, setSum = 0;
for(int num : nums){
set.add((long)num);
arraySum += num;
}
for(Long s : set) setSum += s;
return (int)((setSum * 3 - arraySum) / 2);
}
}
// 借鉴本题的热评,太妙了这算法
// num 出现第一次
// 0 ^ num = num
// num & 1 = num
// a = num
// 0 ^ num = num
// num & ~num = 0
// b = 0
// num 出现第二次
// num ^ num = 0
// 0 & ~0 = 0
// a = 0
// 0 ^ num = num
// num & ~0 = num
// b = num
// num 出现第三次
// 0 ^ num = num
// num & ~num = 0
// a = 0
// num ^ num = 0
// 0 & ~0 = 0
// b = 0
// a = 0, b = 0 ---> a = num, b = 0 ---> a = 0, b = num ---> a = 0, b = 0
// 位运算与顺序无关,最终出现三次的数字都被抵消了
// 出现一次的数字 a = num, b = 0
class Solution {
public int singleNumber(int[] nums) {
int a = 0, b = 0;
for(int num : nums){
a = (a ^ num) & ~b;
b = (b ^ num) & ~a;
}
return a;
}
}