LeetCode——231. 2 的幂(Java)

题目描述

题干:
给你一个整数 n,请你判断该整数是否是 2 的幂次方。
如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。

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

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

示例 3:
输入:n = 3
输出:false

示例 4:
输入:n = 4
输出:true

示例 5:
输入:n = 5
输出:false

题解思路

判断数字是不是2的幂,虽然题目下推荐我们不使用迭代或递归解决,但是我还是写了写

并且都超出了时间限制,所以主要讲讲其他方法,2最大幂的因子我一开始也觉得不靠谱

后来发现确实2的幂的因子确实都是2的幂,而位运算的方法就是需要发现一个规律

如果一个数字是2的幂,那他的二进制就只有一位是1,下面两种写法就见仁见智了

正确代码

class isPowerOfTwoSolution {

    static final int BIG = 1 << 30;

    //递归
    public boolean isPowerOfTwo01(int n) {
        if (n == 1) {
            return true;
        }
        if (n < 0 || n % 2 != 0) {
            return false;
        }
        return isPowerOfTwo01(n / 2);
    }

    //迭代
    public boolean isPowerOfTwo02(int n) {
        if (n < 0) {
            return false;
        }
        while (n % 2 == 0) {
            n /= 2;
        }
        return n == 1;
    }

    //最大二的幂的约数
    public boolean isPowerOfTwo03(int n) {
        return (n > 0) && (BIG % n) == 0;
    }

    //位运算
    public boolean isPowerOfTwo04(int n) {
        return (n > 0) && (n & (n - 1)) == 0;
    }

    //位运算2
    public boolean isPowerOfTwo05(int n) {
        return (n > 0) && Integer.bitCount(n) == 1;
    }
}

总结

结合位运算方法可以灵活解决很多算法问题,要善于发现规律和联系并牢记位运算的公式和规则

如果文章存在问题或者存在更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见
posted @ 2021-05-30 09:30  21岁还不是架构师  阅读(72)  评论(0编辑  收藏  举报