231:2的幂

问题描述

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

示例

输入: 1
输出: true
解释: 20 = 1
输入: 16
输出: true
解释: 24 = 16
输入: 218
输出: false

思路

首先,这题一开始我没啥头绪,写了个循环。求2i次方等于不等于n,如果等于则返回true,不等于返回false。后来发现有一些badcase,看上去像是溢出的,然后就用了long,过了。(方法一)
后来写了几项:20次方,是1,二进制是1. 21次方是2,二进制是1022次方是4,二进制是100. 嘿嘿发现规律了? 嗯! 就是8421大法:即,如果一个数是2n次方,那么它的二进制表示只有最左边是1,其余都是0. 于是乎我写了个移位程序,如果碰到的不是第一位二进制,那么必然是0,否则不对。(方法二, beat 100%)
后来想了一下,我完全可以用更优雅的方法来做。 我们已经知道了符合条件的数的二进制结构。我们发现,如果n是符合条件的,那么n-1的二进制表示肯定与n的二进制表示完全相反。 所以我们只需要判定n&(n-1)的值即可。(方法三)

方法一

Java版

public boolean isPowerOfTwo1(int n) {
        int i = 0;
        for(i = 0; i < 1e7 && (int)Math.pow(2,i) < n; i++);
        return (long)Math.pow(2,i) == n;
    }

方法二

Java版

public boolean isPowerOfTwo2(int n) {
        for(int i = n; i > 1; i>>=1){
            int tmp = i;
            if((tmp&1) == 1){
                return false;
            }
        }
        return true;
    }

方法三

Java版

class Solution {
    public boolean isPowerOfTwo(int n) {
        if(n < 1) return false;
        return (n&(n-1)) == 0;
    }
}

发布了396 篇原创文章 · 获赞 22 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41687289/article/details/104823948