Ruby 等价函数,用于查找给定整数数组中出现奇数次的一个且唯一的元素
我想问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 您可以看到
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
次次次次次次次次次次次次次次次次次次次次。