LeetCode「Power of Two」问题:代码逻辑错误排查请求
排查「Power of Two」代码中的错误
你的代码在处理n=16时返回False的核心问题是:没有筛选出质数就直接检查所有遍历到的数是否能整除n,导致合数也被纳入判断逻辑,触发错误返回。
具体错误分析
以n=16为例:
sqrt(16)=4,循环i的取值范围是3到4- 当
i=4时,内层循环判断4是合数(4%2==0),但你的代码没有跳过这个合数,直接执行if n%i ==0——16%4==0成立,错误返回False
内层循环仅完成了“判断i是否为合数”的动作,但没有标记i是否为质数,导致不管i是质数还是合数,都会去检查是否能整除n,违背了你最初“只检查质数”的思路。
修正后的代码
保留你的核心思路,新增质数标记来筛选需要检查的数:
import math class Solution: def isPowerOfTwo(self, n: int) -> bool: if n == 1: return True if n % 2 != 0: return False max_check = round(math.sqrt(n)) + 1 for i in range(3, max_check): is_prime = True # 判断当前i是否为质数 for j in range(2, round(math.sqrt(i)) + 1): if i % j == 0: is_prime = False break # 仅当i是质数且能整除n时,才判定不是2的幂 if is_prime and n % i == 0: return False return True
修正说明
- 新增
is_prime变量,明确标记当前遍历的i是否为质数 - 仅在
i是质数且能整除n时,才返回False,跳过所有合数的检查 - 处理
n=16时,i=4会被判定为合数,不会触发整除检查,最终正确返回True
额外补充(非必须)
如果追求最优解,可以用位运算实现O(1)时间复杂度:
class Solution: def isPowerOfTwo(self, n: int) -> bool: return n > 0 and (n & (n - 1)) == 0
原理是:2的幂的二进制表示只有一个1,n-1会将这个1变为0并将后面的位全变为1,两者按位与结果为0。
内容的提问来源于stack exchange,提问作者idk31909310
相关产品推荐
相关产品推荐

