You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode「Power of Two」问题:代码逻辑错误排查请求

排查「Power of Two」代码中的错误

你的代码在处理n=16时返回False的核心问题是:没有筛选出质数就直接检查所有遍历到的数是否能整除n,导致合数也被纳入判断逻辑,触发错误返回。

具体错误分析

以n=16为例:

  1. sqrt(16)=4,循环i的取值范围是3到4
  2. 当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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:43:16