题目:
137. 只出现一次的数字 II
面试题56 - II. 数组中数字出现的次数 II
题解:位运算
public static int singleNumber(int[] nums) {
int a = 0;
int b = 0;
for(int i = 0; i < nums.length; i++)
{
a = (a ^ nums[i]) & ~b;
b = (b ^ nums[i]) & ~a;
}
return a;
}
解释一下:假设有一个数为 x,那么则有如下规律:
常用:
x ^ 0 = x;
x ^ x = 0;
x & ~x = 0;
x & ~0 = x;
附:
x ^ 1 = ~x;
x & 0 = 0;
x & 1 = x;
那么就是很好解释上面的代码了。一开始 a = 0,b = 0;代码中的 nums[i] 即为 x。
1. x第一次出现后,a = (a ^ x) & ~b的结果为 a = x,
b = (b ^ x) & ~a的结果为b = 0。(因为此时a = x了)
2. x第二次出现:a = (a ^ x) & ~b,a = (x ^ x) & ~0,a = 0;
b = (b ^ x) & ~a 化简,b = (0 ^ x) & ~0,b = x;
3. x第三次出现:a = (a ^ x) & ~b, a = (0 ^ x) & ~x,a = 0;
b = (b ^ x) & ~a 化简, b = (x ^ x) & ~0,b = 0;
所以出现三次同一个数,a和b最终都变回了0.
只出现一次的数,按照上面x第一次出现的规律可知a = x, b = 0;因此最后返回a即可。
代码:位运算
public class code137 {
public static int singleNumber(int[] nums) {
int a = 0;
int b = 0;
for(int i = 0; i < nums.length; i++)
{
a = (a ^ nums[i]) & ~b;
b = (b ^ nums[i]) & ~a;
}
return a;
}
public static void main(String[] args) {
int nums[] = { 0,1,0,1,0,1,99 };
int res = singleNumber(nums);
System.out.println(res);
}
}