[leetcode]Python实现-231.2的幂

231.2的幂

描述

给定一个整数,编写一个函数来判断它是否是 2 的幂次方。

示例

输入: 1
输出: true
解释: 2020 = 1

输入: 16
输出: true
解释: 2424 = 16

输入: 218
输出: false

思考:
这道题的第一反应是sqrt()函数,但要使用该函数的话需要导入math包,这种做法并不合适刷题。然后就开始思考sqrt()函数是怎么实现的(最近开始好奇python源码了2333),再读一遍题,只要求我们求是不是2的幂,如果考虑sqrt()函数,就把这道题扩大化了,太复杂了。那就来思考一下求是不是2的幂,为什么非要求2呢,不是3,4,5其它数字呢。灵光一现!二进制移位运算啊,之前有总结移位运算的运用里面就有介绍该方法!学习在于总结没毛病。

class Solution:
    def isPowerOfTwo(self, n):
        """
        :type n: int
        :rtype: bool
        """
        if n <= 0:
            return False
        else:
            return bin(n).count('1') == 1

看一哈别人的

        if n < 1:
            return False
        return not(n & (n-1))

太高级了!用数学知识分析一波:假如n为2的次幂,那么n的二进制必定首位为1,其他位为0。而n-1的二进制必定首位为0,其他位为1。所以假如n为2的次幂,则n&(n-1)为0。假如n不是2的次幂,那么二进制数中至少有两个1,而n-1的二进制数只是在n的基础上减一个1.改变末尾的数,相与的结果必定大于0.因此最后用 not(n&(n-1))判断。emmm,后面的解释有点太牵强了,不够严谨,大家看看就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值