给定一个类似:[0,1,1]
我如何优雅地检查:只有一个元素具有非零值而其他元素为0?
(因此,当此数组将通过时,上述数组将无法通过检查:[1,0,0]
)
答案 0 :(得分:8)
my_array.count(0) == my_array.length-1
如果速度很重要,对于非常大的阵列,你可能需要在检测到第二个非零时提前返回,或许:
def only_one_non_zero?( array )
found_non_zero = false
array.each do |val|
if val!=0
return false if found_non_zero
found_non_zero = true
end
end
found_non_zero
end
答案 1 :(得分:6)
最多选择两个非零元素,并检查是否有一个项目可用。
>> [0,1,1].select {|x| !x.zero?}.take(2).size == 1
=> false
>> [0,1,0].select {|x| !x.zero?}.take(2).size == 1
=> true
>> [1,2,3].select {|x| !x.zero?}.take(2).size == 1
=> false
在Ruby 1.8.7中运行良好,但请注意select
返回一个数组,因此它不是“最优懒惰”。 Here's a blog post展示了如何在Ruby中创建一些惰性枚举器。
答案 2 :(得分:2)
感谢您的所有答案!
我也解决了:
input_array = [0,0,0]
result = input_array - [0]
p result.size == 1 && result[0] == 1
Ruby,我爱你!