LeetCode.231 2 的幂

196 阅读4分钟

这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战

题目描述:

231. 2 的幂 - 力扣(LeetCode) (leetcode-cn.com)

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false

如果存在一个整数 x 使得 n=2xn = 2^x,则认为 n2 的幂次方。

示例 1:

输入:n = 1
输出:true
解释:2^0 = 1

示例 2:

输入:n = 16
输出:true
解释:2^4 = 16

示例 3:

输入:n = 3
输出:false

示例 4:

输入:n = 4
输出:true

示例 5:

输入:n = 5
输出:false

 

提示:

231<=n<=2311-2^{31} <= n <= 2^{31} - 1

进阶:

你能够不使用循环/递归解决此问题吗?

思路分析

换底公式

这个我们在LeetCode.326 3的幂中已经解过,直接再写一遍了

n=2x n=2^x x= log2nx= log2 nx=log102log10nx=\frac{log_{10} 2}{log_{10} n}

n2 的幂,那么 log2nlog_2 n 一定是个整数,由换底公式可以的得到 x=log102log10nx=\frac{log_{10} 2}{log_{10} n} ,只需要判断 log2nlog_2 n 是不是整数即可。

同理该公式可以推广到 n 的幂。

AC代码

class Solution {
    fun isPowerOfThree(n: Int): Boolean {
        
       //k的幂
        val k = 2
        val a = Math.round(Math.log(n.toDouble()) / Math.log(k.toDouble()))
        val pow = Math.pow(k.toDouble(), a.toDouble()).toLong()
        return n > 0 && pow == n.toLong()

    }
}

整数限制

同样来自于LeetCode.326 3的幂中的解法

在题目给定的 32 位有符号整数的范围内,最大的 2 的幂为 230=107374182422^{30} = 10737418242

我们只需要判断 n 是否是 2^{30} 的约数即可。

AC代码

const val BIG = 1 shl 30

class Solution {
    fun isPowerOfTwo(n: Int): Boolean {
        return n > 0 && BIG % n == 0
    }
}

硬编码

由上面的题解我们知道最大的 2 的幂为 230=107374182422^{30} = 10737418242

所以我们硬编码穷举所有例子也就区区三十来行而已哈哈

这个很简单了,直接上代码

AC代码

class Solution {
    public boolean isPowerOfTwo(int n) {
        switch (n) {
            case 0b1:
            case 0b10:
            case 0b100:
            case 0b1000:
            case 0b10000:
            case 0b100000:
            case 0b1000000:
            case 0b10000000:
            case 0b100000000:
            case 0b1000000000:
            case 0b10000000000:
            case 0b100000000000:
            case 0b1000000000000:
            case 0b10000000000000:
            case 0b100000000000000:
            case 0b1000000000000000:
            case 0b10000000000000000:
            case 0b100000000000000000:
            case 0b1000000000000000000:
            case 0b10000000000000000000:
            case 0b100000000000000000000:
            case 0b1000000000000000000000:
            case 0b10000000000000000000000:
            case 0b100000000000000000000000:
            case 0b1000000000000000000000000:
            case 0b10000000000000000000000000:
            case 0b100000000000000000000000000:
            case 0b1000000000000000000000000000:
            case 0b10000000000000000000000000000:
            case 0b100000000000000000000000000000:
            case 0b1000000000000000000000000000000:
                return true;
            default:
                return false;
        }
    }
}

或者十进制下的

class Solution {
    public boolean isPowerOfTwo(int n) {
        switch (n) {
            case 1:
            case 2:
            case 4:
            case 8:
            case 16:
            case 32:
            case 64:
            case 128:
            case 256:
            case 512:
            case 1024:
            case 2048:
            case 4096:
            case 8192:
            case 16384:
            case 32768:
            case 65536:
            case 131072:
            case 262144:
            case 524288:
            case 1048576:
            case 2097152:
            case 4194304:
            case 8388608:
            case 16777216:
            case 33554432:
            case 67108864:
            case 134217728:
            case 268435456:
            case 536870912:
            case 1073741824:
            return true;
        }
        return false;
    }
}

总结

这题除了官解中提到的二进制解法之外,其他的解法基本都是轻车熟路了,位运算略微有点不熟,这里mark下,下一轮一定把二进制解法补上。

参考

LeetCode.326 3的幂 (juejin.cn)

2的幂 - 2 的幂 - 力扣(LeetCode) (leetcode-cn.com)

扩展阅读

位运算

5种解法,你应该背下的位操作知识 - 2 的幂 - 力扣(LeetCode) (leetcode-cn.com)

【宫水三叶】运用 lowbit 判断 2 的幂 - 2 的幂 - 力扣(LeetCode) (leetcode-cn.com)