我正在尝试解决hackerrank上的this问题,我花了一些时间来解决问题。
诀窍在于xor的属性以及数字出现在数组子集中的次数,其中子集是连续的(请注意)。
因此,如果我们有1,2,3子集将是:
1
1,2
1,2,3
2
2,3
3
索引i中的值出现在这些子集中的次数是(n-i)*(i+1)
,因为可以看出1出现(3-0)*(0 + 1)= 3次。 n 是数组的长度。
第二个技巧是XOR
一个数字是0自身如果我们取这个数字偶数次,如果它看起来奇数次答案是数字本身,那么重要的是要注意{ {1}}操作是关联的。
问题要求我们对子集进行xor,然后取每个结果值的XOR
。
因此,我不计算蛮力,而是计算每个数字出现在数组中的次数,并检查它是否出现偶数次或奇数次,但是8个测试用例通过,4次失败。测试用例太长,无法调试或干运行。
我的问题是4个测试用例失败的原因。这是Java代码。
XOR
答案 0 :(得分:1)
原因是
溢出(j+1)*(n-j)
该产品可能为~10^10
,因为数组的总大小最多为10^5
。
因此,您需要使用long
计算此产品。
我使用这个虚拟更改测试了您的代码:
long a = j + 1;
long b = (n - j);
if((a*b)%2==1) {
an=an^arr[j];
}
程序成功通过了所有测试。