我不理解这个算法。
对于程序中给出的数组,如果
i = 0, num = num ^ arr[0] => num = 0 ^ 3 = 3
i = 1, num = num ^ arr[1] => num = 3 ^ 1 = 2
i = 2, num = num ^ arr[2] => num = 2 ^ 5 = 7
...etc...and the last result in num will be printed.
这里发生了什么?它是如何删除具有相同值的数字的?
此算法找到仅出现在数组中的元素,但是如何?
class Ideone {
public static int a() {
int arr[] = {3,1,5,1,5,3,4,7,7};
int num = 0;
for(int i = 0; i < arr.length; i++){
num ^= arr[i];
}
return num;
}
public static void main (String[] args) throws java.lang.Exception {
System.out.println(a());
}
}
答案 0 :(得分:3)
在这种情况下,XOR运算符实际上取消了出现两次的值,只留下出现一次的数字。
0 ^ 3 = 3 // first time
3 ^ 3 = 0 // second time
将XOR(&#34; exclusive或&#34;)视为删除两个值之间的共同点。 More on XOR.
答案 1 :(得分:3)
你看到效果的原因是数字的XOR本身总是产生零,而XOR的commutativity - 即你从列表中选择操作数的顺序不是这样的事实改变行动的结果。
很容易看出,如果安排你的清单
A ^ B ^ C ^ B ^ A ^ D ^ C
以所有相同的对彼此相邻的方式
A ^ A ^ B ^ B ^ C ^ C ^ D
您可以按如下方式对列表进行分组:
(A ^ A) ^ (B ^ B) ^ (C ^ C) ^ D
-- ------- ------- -------
-- zero zero zero
因此结果是D
,即原始列表中不重复的唯一值。由于XOR的可交换性,无论应用XOR的顺序如何,结果都是相同的。