我遇到了编码挑战:检查给定的正数组是否为2
的幂,如果返回1
则为0
。前
A=[2,3,4]
输出:A=[1,0,1]
输入:A =[1048,2048,1048576]
A=[1,1,1]
我想出了这个功能。
def checkPw (arr)
arr.map{|a| a != 0 && (a%2==0)?1 :0 }
end
此函数通过了提供的测试,但我不确定它是否是干净的方法。我想知道是否有更明确的方法来检查数组元素的功能。
答案 0 :(得分:6)
有一个检查正整数是2的幂的技巧。这是比较x
和x - 1
的按位AND是否为0。因此,您可以对数组a
执行以下操作,以检查每个元素是否为2的幂:
a.all?{|x| x & (x - 1) == 0}
示例:
[2048, 2048, 1048576].all?{|x| x & (x - 1) == 0}
=> true
[1048, 2048, 1048576].all?{|x| x & (x - 1) == 0}
=> false
如果您想检查每个元素:
a.map{|x| x & (x - 1) == 0 ? 1 : 0}
答案 1 :(得分:4)
另一种方式:
def po2?(arr)
arr.map { |n| (n.to_s(2) =~ /^10*$/) ? 1 : 0 }
end
po2? [1,2,4,7,1024,1025]
#=> [1,1,1,0,1,0]
例如,
n = 1024
s = n.to_s(2)
#=> "10000000000"
s =~ /^10*$/)
#=> true
n = 1025
s = n.to_s(2)
#=> "10000000001"
s =~ /^10*$/)
#=> false
答案 2 :(得分:2)
您可以使用一些技巧来确定解决方案,但也有一个Ruby方法专门用于查找特定数字的2的幂。您可以检查此方法的输出是否为整数,即:
array.map { |number| (Math.log2(number) % 1) == 0 ? 1 : 0 }