这是一个采访问题:
我对布尔人的态度非常粗糙,因为我在一年左右的时间内没有参加我的Java课程,所以任何帮助或想法都会受到高度赞赏。
答案 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:]))