计数" 0 xor 1 xor 2 xor ...... xor N",例如,我给第三个作为N,程序应该返回0,现在我将我的代码放到在线jundge,结果是时间超限,我几乎找不到错误的地方,任何人都可以给我一些建议,在此先感谢。
long long xorSum(long long x) {
long long j =0;//we supposed x is big enough ,less than 10^18.
for (long long i=1 ;i<=x;i++) {
j ^= i;
}
return j;
}
答案 0 :(得分:3)
简单逻辑,适用于O(1)
long long xorSum(long long k) {
switch (k % 4) {
case 0: return k;
case 1: return 1;
case 2: return k + 1;
case 3: return 0;
}
}
证明,使用归纳法:从1到4,我们可以很容易地看出逻辑是正确的。假设上述逻辑是正确的,直到x
为x % 4 = 3
,因此当前总和为0.
x + 1
(x + 1) % 4 = 0
开始,所以二进制表示总是xxx00
(xxx
表示任何二进制数),所以xor和最后一个总和,我们将为0得到xxx00
。xxx01
- &gt; xor将为xxx00 xor xxx01 = 00001
。xxx01
到xxx10
- &gt; xor将为00001 xor xxx10 = xxx11
xxx10
到xxx11
- &gt; xor将是xxx11 xor xxx11 = 00000
- &gt;请注意xxx11 % 4 = 3
,它会重新启动整个序列并完成校对。