编写一个接受整数作为参数的函数,并返回一个布尔值。

时间:2012-11-20 02:00:28

标签: java python

这是一个采访问题:

  1. 编写一个接受整数作为参数的函数,并返回一个布尔值。如果整数是指数(幂)为2,则返回的布尔值为true,否则为false。 一个。没有数学库或按位运算,只有+ - * /% 湾1是2的第0次幂。 C。没有花车,所以没有“负面力量”。 d。通常应该比权力更快地识别非权力。 即任何语言,虽然与期望的位置一般重叠是明智的。
  2. 我对布尔人的态度非常粗糙,因为我在一年左右的时间内没有参加我的Java课程,所以任何帮助或想法都会受到高度赞赏。

5 个答案:

答案 0 :(得分:5)

满足所有4项要求的最佳方法是将n减半,直到它为奇数或1。

def ispow(n):
    while True:
        if n == 1:
            return True
        if n % 2 == 1:
            return False
        n = n / 2

输出:

1 True
2 True
3 False
4 True
5 False
6 False
7 False
8 True
9 False
10 False

答案 1 :(得分:2)

蒂姆的回答显然是采访者正在寻找的答案。

但是,你可以通过违反规则做得更好:

  

d。通常应该比权力更快地识别非权力。

正如BoppreH所指出的那样,向上而不是向下计算的答案要快得多(至少在大多数语言和平台上),因为没有分裂。在最糟糕的情况下,他的实施速度比蒂姆快了近一个数量级。

当然BoppreH的平均情况和最佳情况与最坏情况基本相同,而在Tim的情况下,最好的情况要好得多。但通常情况下最糟糕的情况非常重要,所以这肯定是一个值得研究的权衡。

或者:

  

一个。没有数学库或按位运算,只有+ - * /%

蒂姆解决方案的缓慢部分是分部操作员,但实际上,他们没有必要。您可以将n % 2 == 1替换为n & 1,将n = n / 2替换为n = n >> 1,保证等效,并且最糟糕的情况是比一个数量级更快 - 甚至比BoppreH的。

这是你可能期望编译器为你做的事情,比如C(然后再尝试在C中处理没有数学库的2**100000),但在Python中(至少CPython) - 这可能值得尝试PyPy,也许是Jython和IronPython),你必须手动完成。你应该被允许。

这就是为什么这些面试问题是愚蠢和毫无意义的,除了作为进一步讨论的起点。他们正在寻找的答案往往不是您想要在实际代码中使用的答案。

答案 2 :(得分:1)

缩短并且每次迭代仅执行乘法。

def is_power(x):
    current_power = 1
    while current_power < x:
        current_power *= 2
    return current_power == x

x = 2 ^ 100.000

的基准
number = str(2 ** 100000)
cProfile.run('is_power(' + number + ')')
cProfile.run('ispow(' + number + ')')
cProfile.run('is_pow_2(' + number + ')')
  • is_power(this):1.264秒

  • ispow(Tim的回答):11.455秒

另一个尚未完成......

答案 3 :(得分:0)

当其他所有方法都失败时,请使用force:

def is_pow_2(x):
    i=0
    while 2**i <= x:
        if x == 2**i:
           return True
        i += 1
    return False

答案 4 :(得分:0)

怎么回合

import re
n = 2**5
print   bool(re.match("^10*$",bin(n)[2:]))