学习算法Day1(异或)
题目一
给一组整数数列, 其中只有一个数出现奇数次, 其余数出现偶数次, 求这一个数?
异或的性质
- 0 ^ 任何数 = 任何数
- a ^ a = 0
- a ^ b = b ^ a
- a ^ b ^ c = a ^ c ^ b
public static int xor1(int[] a) {
for (int i = 1; i < a.length; i++) {
a[0] = a[0] ^ a[i];
}
return a[0];
}
题目二
给一组整数数列, 其中有两个数出现奇数次, 其余数出现偶数次, 求这两个数?
思路
跟第一问一样的跑法只能的到 a ^ b
只要 a ^ b 不等于0, 就可以得到 至少a 和 b 有某一位不等于0
关键就是找到这一位
若 异或一轮的结果是 err, 那么这一位就是
$ err = 100100$
\(~err = 011011\)
\(~err + 1 = 011100\)
err & ~err + 1
\(result = 000100\)
public static int[] xor2(int[] a) {
int err = 0;
for (int i = 0; i < a.length; i++) {
err = err ^ a[i];
}
int once = err & ~err + 1;
int right = 0;
for (int i = 0; i < a.length; i++) {
if((once & a[i]) == 0) right ^= a[i];
}
int[] w = {right, right ^ err};
return w;
}