这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战
题目描述:
231. 2 的幂 - 力扣(LeetCode) (leetcode-cn.com)
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 ,则认为 n 是 2 的幂次方。
示例 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
提示:
进阶:
你能够不使用循环/递归解决此问题吗?
思路分析
换底公式
这个我们在LeetCode.326 3的幂中已经解过,直接再写一遍了
即 即
若 n 是 2 的幂,那么 一定是个整数,由换底公式可以的得到 ,只需要判断 是不是整数即可。
同理该公式可以推广到 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 的幂为
我们只需要判断 n 是否是 2^{30} 的约数即可。
AC代码
const val BIG = 1 shl 30
class Solution {
fun isPowerOfTwo(n: Int): Boolean {
return n > 0 && BIG % n == 0
}
}
硬编码
由上面的题解我们知道最大的 2 的幂为
所以我们硬编码穷举所有例子也就区区三十来行而已哈哈
这个很简单了,直接上代码
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下,下一轮一定把二进制解法补上。
参考
2的幂 - 2 的幂 - 力扣(LeetCode) (leetcode-cn.com)
扩展阅读
位运算
5种解法,你应该背下的位操作知识 - 2 的幂 - 力扣(LeetCode) (leetcode-cn.com)
【宫水三叶】运用 lowbit 判断 2 的幂 - 2 的幂 - 力扣(LeetCode) (leetcode-cn.com)