231. 2 的幂

72 阅读1分钟

说实话力扣的答案真的是太精简了,本人数学又不好

这是我的答案

class Solution {
    public boolean isPowerOfTwo(int n) {
        int i = 0;
        double mark = 0;
        while(mark < n){
            mark = Math.pow(2,i);
            if(mark == n){
                return true;
            }
            i++;
        }
        return false;
    }
}

这是力扣官方的 -- 我真的不想带脑子看这个分析了

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

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/power-of-two/solution/2de-mi-by-leetcode-solution-rny3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我个人的思路就是直接循环取值判断,while大循环里,不断判断输入值n和每次生成2的指数的比较即可 这里最坑的点在于,math.pow返回的类型是double类型,之前我的mark是int类型,然后强转math.pow的值,这里的坑就在Integer.Max_Value的最大值是2147483647,然后力扣就用这个值来测试,返回的是true,实际上正确的是false,这就是最坑的,然后把mark的类型换成double就可以了,其实之前有换过long,换成long强转math.pow力扣的编译过不去报错,我vscode可以,其实每次写力扣,过不去我都得在vscode上单步调试看看错在哪,这个类型的问题差点就把我调懵逼了

后续优化的方向

算法本身的优化 - 类似力扣的答案
预处理 - 先把所有的值列举出来,存到一张表里,然后直接比较,轮询一遍没有就false,因为数据类型是有上限的intlong,所以如果几个值都不存在,直接就可以下结论了