JAVA - 按位异或赋值运算符如何在此给定解决方案中工作

时间:2018-01-24 03:28:30

标签: java arrays

我最近在做一些编码挑战,这是其中一个问题。

  

给出了由N个整数组成的非空零索引数组A.该数组包含奇数个元素,并且该数组的每个元素可以与具有相同值的另一个元素配对,除了一个未配对的元素。找到不成对的价值。例如,给定数组A:A [0] = 9 A [1] = 3 A [2] = 9 A [3] = 3 A [4] = 9 A [5] = 7 A [6] = 9功能应该返回7.

完成自己的工作后,我遇到了这个解决方案。

public int solution(int[] A) {
  int r = 0;
  for(int i=0;i<A.length;i++)
    r ^=A[i];

  return r;
}

我很惊讶这段代码。我以前从未见过独有的OR赋值运算符,并且想知道这个解决方案是如何工作的。如果有人能够引导我完成这个简单的代码并解释它是如何工作的那将是美妙的。

2 个答案:

答案 0 :(得分:9)

简而言之,A会回复^B。两个0 ^ thatUnPairedValue不需要是连续的:只要你有两次异或相同的值,就可以清除效果。在您的问题中,由于值是成对的,因此通常相同的值将被异或两次,这对最终值没有影响,除了未配对的值。因此,最终结果只是thatUnPairedValue,只是Order.where("created_at >= :start_time", start_time: 1.day.ago.beginning_of_day.utc + 16.hours)

答案 1 :(得分:1)

对于二进制系统

,两个相同数字之间的xor application/vnd.???.sqsh+gzip导致零
^

同样适用于任何系统,在您的示例中,9的二进制表示为0^0=0 1^0=1 1^1=0 ,因此1001^之间的xor 9

9

因此,在您的示例中, 1001 1001 ---- 0000 ---- 为零,(9^9)^(9^9)为0,而(3^3)0^7