来自北大算法课的Leetcode题解:231. 2的幂

代码仓库Github | Leetcode solutions @doubleZ0108 from Peking University.

  • 解法1(T37% S20%): 如果n是2的幂次方,则n对2取对数一定是整数,可再用2的乘方进行还原,如果取整 l o g 2 n log_2n log2n后计算 2 l o g 2 n 2^{log_2n} 2log2n与n不想等则n不是2的幂次方

    • 注意负数和零一定不是2的幂次
  • 解法2(T65% S39%): 不停的对n整除2,如果n始终对2取余为0,则是2的幂次方,否则不是

    • 改进1(T85% S33%): 用位运算和移位运算替换取余和除法

      while n != 1:
          if n & 1: return False  #  <=>  n % 2 != 0
          n >>= 1  #  <=>  n //= 2
      
  • 解法3(T65% S66%): 幂运算,对于是2的幂次的数,其二进制一定只有最高位是1,其他均为0

    return n>0 and not (n & (n-1))
    
class Solution(object):
    def isPowerOfTwo(self, n):
        """
        :type n: int
        :rtype: bool
        """
        # 解法1
        if n<=0: return False
        return pow(2, int(log(n,2))) == n


    def otherSolution(self, n):
        # 解法3
        return n>0 and not (n & (n-1))

        # 解法2
        if n <= 0: return False

        while n != 1:
            # if n%2 != 0: return False
            # n //= 2
            # 改进1
            if n & 1: return False
            n >>= 1

        return True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

doubleZ0108

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值