检查数组元素是否为2的幂

我遇到了编码挑战:检查给定的正数组是2幂,如果是,则返回1否则为0 。 前

  • 输入: A=[2,3,4]
  • 输出: A=[1,0,1]

  • 输入: A =[1048,2048,1048576]

  • 输出: A=[1,1,1]

我想出了这个function。

 def checkPw (arr) arr.map{|a| a != 0 && (a%2==0)?1 :0 } end 

这个函数通过了提供的测试,但我不确定它是否是干净的方法。 我想知道是否有更明确的方法来检查数组元素的function。

有一个检查正整数是2的幂的技巧。这是比较xx - 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} 

其他方式:

 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 

您可以使用一些技巧来确定解决方案,但也有一个Ruby方法专门用于查找特定数字的2的幂。 您可以检查此方法的输出是否为整数,即:

 array.map { |number| (Math.log2(number) % 1) == 0 ? 1 : 0 }