T231 2 的幂

题目描述如下:

简单题欸,咱只需要循环判断一下就可以了欸

代码如下:

class Solution:
    def isPowerOfTwo(self, n: int) -> bool:
        if n <= 0:
            return False
        for i in range(0, 32):
            if n == 2**i:
                return True
        return False

可是结果很差欸:

应该是2**i那里重复运算了,每一次计算,都需要从原来的2的1次方依次乘上去,所以我改了改:

class Solution:
    def isPowerOfTwo(self, n: int) -> bool:
        if n <= 0:
            return False
        tmp = 1
        for i in range(0, 32):
            if n == tmp:
                return True
            tmp = tmp*2
        return False

结果如下:

快事快了一奈奈,但是效果还是太差了,肯定是有什么简易的方法判断是不是2的幂。想到可能按位运算更快一些,但是如何用呢,所有的2的幂,二进制肯定是1000000这样的类型的,因此,减1肯定变成0111111这种,这样按位与一下如果为0就是了。应该是O(1)的复杂度

代码如下:

class Solution:
    def isPowerOfTwo(self, n: int) -> bool:
        if n <= 0:
            return False
        else:
            return (n & n-1) == 0

结果如下:

又想了想,也参考了下带佬的代码,好像思路都是这样,要再快的话可能就是面向测试用例编程了??将那32个数放集合里,判断是否在哈希表里,若是返回True这样?也许会快一点点也说不定,毕竟都是O(1)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值