美好的一天。在不同的编程竞赛中解决一种'找到独特价值'问题的常见做法是使用此代码arr.reduce(:^)
:
例如像那样的任务给你一个奇数长度的整数数组,除了一个数字之外,它们都是相同的。找到这个号码通常以这种方式解决:
[8,8,8,5,8,8,8].reduce(:^) # 5
我开始做实验,发现这个解决方案存在一个差距,现在是:
p [8,2,2].reduce(:^) # 8
p [8,2,2,2].reduce(:^) # 10 !!!!!!!!
p [8,2,2,2,2].reduce(:^) # 8
我发现在任何数组格式[x,y,y,y]
x
都无法找到reduce(:^)
:
p x = rand(1..100)
p y = rand(1..100)
p [x, y, y, y].reduce(:^) == x # FALSE (!)
puts "But!"
p [x, y, y ].reduce(:^) == x # true
p [x, y, y, y, y ].reduce(:^) == x # true
为什么会这样? (我的红宝石是MRI 2.3.0)
答案 0 :(得分:2)
您将获得奇数长度整数数组,...
[8, 2, 2, 2]
奇数长度怎么样?
第三个2
永远不会被异化。有人可能会逐步检查:
8 ^ 2
#⇒ 10
8 ^ 2 ^ 2
#⇒ 8 # because 2 and 2 are XOR’ed out
8 ^ 2 ^ 2 ^ 2
#⇒ 10 # because it’s the same as 8 ^ 2
此外:
2 ^ 2 ^ 2
#⇒ 2
答案 1 :(得分:1)
@mudasobwa answer is correct. However for more insight you might wanna have a a look at:
https://www.calleerlandsson.com/rubys-bitwise-operators/
For your use case you are better off with:
[8,2,2,2].inject{|i,n| i > n ? i : n}
Let's see what's going on under the hood:
def max_array_int(arr)
arr.inject do |i,n|
check = i > n ? i : n
puts "evaluated #{i} > #{n}. result: #{check}"
check
end
end
max_array_int [10,3,15,7]