只出现一次的数字Ⅱ

// 较好理解的方法,用 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;
}
}
这篇博客介绍了两种使用位运算找到整数数组中只出现一次的数字的方法。第一种方法利用HashSet去重并计算数组和与集合和的差值。第二种方法通过位运算,将出现一次的数字保留,出现两次的数字相互抵消,从而找到目标数字。这种方法巧妙地利用了位运算的特性,简化了问题的解决过程。
917

被折叠的 条评论
为什么被折叠?



