首先打了个表看了一下1~N的自然数所有都异或起来的规律。
然后发现:
if n == 4*m, then f(n) = n
else if n == 4*m + 1, then f(n) = 1
else if n == 4*m + 2, then f(n) = n+1
else n = 0
// m 为整数
a ^ a = 0;
a ^ 0 = a;
a ^ b ^ b = a;
问题:
在1~1000中所有数出现一次之后,我们随机加入一个数,空间O(1),时间O(n)算法,只访问一次数组元素。
把这些数全部异或起来,再计算一遍1~1000的数异或起来,这两个数进行异或即可。
int p = 0,q = 0;
for(int i = 1; i <= 1001; i ++)
p = a[i] ^ p ;
q = 1000;
p ^= 1000;
return p;
等我学一些博弈论再来填坑……