每天一道算法题-2的幂【备战蓝桥】2022/3/26

2的幂【备战蓝桥】2022/3/24


原题链接: 2的幂
在这里插入图片描述

思路

本题难度较低,但会引入位运算

方法一:

  1. 如果这个数小于等于0,直接返回false
  2. 如果这个数是偶数,除以2;一直循环,直到这个数变成奇数
  3. 检查这个数最后是不是1,如果是1说明这个数原来是2的幂,如果不是说明不是

还有类似的方法,

  1. 如果这个数小于等于0,直接返回false
  2. 给1乘以2,循环,直到结果大于或者等于n
  3. 若等于,说明n是2的幂,若大于说明不是

这俩种方法一个做的是除法,一个做的是乘法

代码:

class Solution {
    public boolean isPowerOfTwo(int n) {
        if(n<=0) return false;
        while(n%2==0){
            n=n/2;
        }
        if(n==1){
            return true;
        }else{
            return false;
        }
    }
}

方法二:

使用位运算
首先学习一个知识点,如果一个数是2的幂,那它在二进制表示下,一定是若干个0和一个1。比如8,
用二进制表示为:1000。同是如果把这个数减去1,新得到的数在二进制表示下,一定是若干个1和一个0,且1和0的位置一定是互补的。比如8-1:0111。

1000
0111

那么把这俩个数按位与,得到的结果一定是0;
即:如果n是2的幂,那么就有n&(n-1)==0
但注意:0比较特殊,它也符合n&(n-1)==0

基于这个特点就可以写代码了

代码:

class Solution {
    public boolean isPowerOfTwo(int n) {
       if(n==0) return false;
       long m=(long)n;//n-1可能会超出int型数据的范围
       if((m&(m-1))==0){
           return true;
       }else{
           return false;
       }
    }
}

有其它问题可以在评论区交流。

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值