231 2的幂(递归、位运算)

1. 问题描述:

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

示例 1:
输入: 1
输出: true
解释: 20 = 1

示例 2:
输入: 16
输出: true
解释: 24 = 16

示例 3:
输入: 218
输出: false
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/power-of-two

2. 思路分析:

① 一个比较容易想到的方法是使用一直除以2的方式来判断是否是2的幂次方,假如在整除的过程发现不是2的倍数那么肯定不是2的幂次方直接返回False即可,对于相同的问题的求解可以使用递归实现(也可以是使用循环来实现),我们在递归往下求解的过程中先判断出当前的n是否是2的倍数如果是才往下进行求解,当发现不是2的倍数的时候这个时候就会返回到上一层了,然后进行层层返回False(只要是求解过程中发现是False那么最终答案肯定是层层返回False的)。

② 除了使用递归的方法来进行求解的思路我们还可以使用位运算的方法进行求解,官方提供的解题思路中使用的就是位运算方法进行求解的,其中使用到了一个比较重要的判断表达式,x & -x == x,&进行按位与运算,会保存最右边的1,所以假如是2的幂次方那么肯定是只存在一个1的,不是则不止一个1,所以使用这个表达式进行判断即可求解,力扣题解

③ 位运算中还要一个比较常用的判断是否是2的整数次幂的公式:x & (x - 1) == 0。

3. 代码如下:

递归:

class Solution:
    def recursion(self, n: int):
        if n == 1:
            return True
        return n % 2 == 0 and self.isPowerOfTwo(n // 2)

    def isPowerOfTwo(self, n: int) -> bool:
        # 只要是有一个条件不满足那么肯定是False的
        if n == 0: return False
        # 递归进行求解
        return self.recursion(n)


if __name__ == '__main__':
    print(Solution().isPowerOfTwo(256))

位运算:

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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值