有人用异或法解第二题吗。。
Topic source都没说清楚,这种解法的巧妙在于,利用了异或算法的交换律和结合律。
计算s的过程应该看成一个整体(包括最后一步),举个例子,原数列是1、2、3,打乱+随机去掉以后变成了3、2,那么本解答中的s计算过程就变成了:1^3^2^2^3,经过交换律和结合律:1^(2^2)^(3^3)=1^0^0=1,这样就找出了去掉了哪个数字,也就是1。
高手!受教了。
这里用到位级运算异或的两个性质和两个运算定律:
- 0 ^ X = X;
- X ^ X = 0;
- 交换律;
- 结合律.
另外,由于每次循环计算 s 在 x++ 操作之前,所以最后一个 x = 20 没有进行异或计算,循环外再将 s 和 x 进行一次异或计算,收工。
- 1
不考7不改名-
private static int findMissingNumber(int start, int end, List<Integer> list) {
int s = 0;
int x = start;
for(int i : list) {
s = s^x^i;
x++;
}
return s^0^x;
}