Ruby 等价函数,用于查找给定整数数组中出现奇数次的一个且唯一的元素

Ruby 等价函数,用于查找给定整数数组中出现奇数次的一个且唯一的元素,ruby,Ruby,我想问ruby一个简单的问题 以下方法返回给定整数数组中出现奇数次的元素。保证存在一个且唯一一个出现奇数次的元素 seq.detect { |n| seq.count(n).odd? } 另一个简洁的解决方案是: seq.reduce(:^) 我需要解释后一种方法。你的前提不正确。它们给出了不同的结果: seq = [1,2,3,2] seq.detect { |n| seq.count(n).odd? } # => 1 seq.reduce :^ # => 2 您可以看到

我想问ruby一个简单的问题

以下方法返回给定整数数组中出现奇数次的元素。保证存在一个且唯一一个出现奇数次的元素

seq.detect { |n| seq.count(n).odd? }
另一个简洁的解决方案是:

seq.reduce(:^)

我需要解释后一种方法。

你的前提不正确。它们给出了不同的结果:

seq = [1,2,3,2]
seq.detect { |n| seq.count(n).odd? }  # => 1
seq.reduce :^  # => 2
您可以看到答案是不同的,后者的答案甚至不符合过滤条件

我认为其意图是使用以下事实:
^
(XOR)是可传递的,
x^x==0
表示所有
x
,以及
x^0==x
表示所有
x
。因此,所有偶数次出现的值都应该自动抵消。问题是当两个或多个其他值的异或产生列表中的一个值时,即,
1^3==2



附加约束修复了我上面概述的问题。如果一个且只有一个值出现奇数次,那么它不能与另一个奇数出现异或以产生冲突。所有偶数出现都是自相消的,只剩下一个奇数出现与零异或,即奇数出现。

好吧,^是异或方法

1^1=0,
1 ^ 1 ^ 1 = 0 ^ 1 = 1, 
1^2=binary(01)^binary(10)=binary(11)=3

因此,通过使用reduce,您可以遍历数组,并应用xor操作

因此,偶数次出现的元素的异或结果是0,奇数次出现的元素的异或结果是元素本身

所以,总的异或结果是出现奇数次的元素

seq.detect { |n| seq.count(n).odd? }
例如,您有
arr=[2,3,3,5,2,7,5]

调用
arr.reduce(:^)
时,其工作原理与以下类似:

((((((2 ^ 3) ^ 3) ^ 5) ^ 2) ^ 7) ^ 5)
xor满足交换律和结合律,所以,它等价于

(2 ^ 2) ^ (3 ^ 3) ^ (5 ^ 5) ^ 7 = 0 ^ 0 ^ 0 ^ 7 = 7

所以,你会发现答案是
7

对于第二个解决方案,我想你有一个前提:所有其他元素都出现偶数次,只有一个出现奇数次。是吗?@sam说得对,这是codewar问题的解决方案之一。确实有一个前提和你说的完全一样。我只是忘了。尊敬,谢谢。我如何修正后一种方法?我是说使用reduce?我刚刚更新了我的问题。我忽略了一个重要的条件回答得很好,但当你说“…并对每两个相邻元素进行异或运算”时,你的解释是不正确的。它与邻接无关。关键是,如果将
n
的一个值异或到
reduce
的备忘录中,并且将
n
再次异或,则备忘录将与两个
n
都没有异或的备忘录相同。这意味着,如果
n
为异或,则备忘录的异或次数为偶数,与没有
n
为异或的备忘录相同。是的,您指出的句子不正确。这是备忘录异或与下一个元素,直到结束。谢谢。因此,对所有出现偶数次的元素进行异或运算对
reduce
的备忘没有影响。这将使一个元素出现奇数次。如果出现次数
m
m-1