leetcode刷题9

今天遇到的题是LeetCode第231题。该题是一道简单题,要求输入一个数n,判断这个数是不是2的幂次方
看到这个题,首先想到的就是利用位运算,因为二进制的位运算是比较高效的
我自己的解决方案是下面的代码:

public static boolean judge(int n){
    int num=1;
    boolean flage=false;
    while (num<=n){
        if (num==n){
            flage=true;
           break;
        }else {
            num=num<<1;
        }
    }
    return flage;
}            

但是该方案在n特别大的时候,会超时。在参考了其他人的解答方案后,发现如果一个数n是2的幂次方,那么这个数一定满足三个条件:

①这个数的二进制最高位是1,其他位是0;
②这个数减一的最高位是0,其他位是1;
③这个数一定大于0
因此可以利用位运算中的与,代码如下:

public static boolean judge2(int n){
    //if (n<=0) return false;
    //return ((n&(n-1))==0);
    //或者写成
    return n>0 && (n&(n-1))==0;
}

  

posted @ 2019-08-14 10:47  刘云生  阅读(199)  评论(0编辑  收藏  举报