86 - 4的幂
题目
给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。
示例 1:
输入: 16 输出: true
示例 2:
输入: 5 输出: false
进阶: 你能不使用循环或者递归来完成本题吗?
解答
这不和3的幂一模一样吗。。
取余
var isPowerOfFour = function (num) {
if (num <= 0) {
return false
}
while (num % 4 === 0) {
num = Math.floor(num / 4)
}
return num === 1
};
Runtime: 64 ms, faster than 90.43% of JavaScript online submissions for Power of Four.
Memory Usage: 35.8 MB, less than 100.00% of JavaScript online submissions for Power of Four.
4进制
var isPowerOfFour = function (num) {
if (num <= 0) {
return false
}
return /^10*$/.test(num.toString(4))
};
Runtime: 68 ms, faster than 79.61% of JavaScript online submissions for Power of Four.
Memory Usage: 35.7 MB, less than 100.00% of JavaScript online submissions for Power of Four.
log
var isPowerOfFour = function (num) {
return (Math.log10(num) / Math.log10(4)) % 1 === 0
};
Runtime: 84 ms, faster than 16.84% of JavaScript online submissions for Power of Four.
Memory Usage: 35.6 MB, less than 100.00% of JavaScript online submissions for Power of Four.
看起来骚但跑起来慢哈哈哈😂
32位最大值
int32最大值为2147483647,因此$log_4(2147483647)=lg(2147483647)/lg(4)=15.4999999997$
换言之,int32最大的4的幂是$4^{15}=1073741824$
var isPowerOfFour = function (num) {
return num > 0 && 1073741824 % num === 0
};
似乎不对?
go
func isPowerOfFour(num int) bool {
if num <= 0 {
return false
}
for num%4 == 0 {
num /= 4
}
return num == 1
}
Runtime: 4 ms, faster than 40.63% of Go online submissions for Power of Four.
Memory Usage: 2.1 MB, less than 100.00% of Go online submissions for Power of Four.
func isPowerOfFour(num int) bool {
result, _ := regexp.MatchString("^10*$", strconv.FormatInt(int64(num), 4))
return result
}
Runtime: 8 ms, faster than 40.63% of Go online submissions for Power of Four.
Memory Usage: 5.7 MB, less than 100.00% of Go online submissions for Power of Four.
二进制位
作者:infinity-2
链接:https://leetcode-cn.com/problems/power-of-four/solution/java-wei-by-infinity-2/
32位数如果是4的幂,那么只有奇数位有且只有一个1,偶数位都是0。判断条件为与0xaaaaaaaa做与运算结果为0。(a=1010)
作者:elliotxx
func isPowerOfFour(num int) bool {
return num > 0 && num&(num-1) == 0 && 0xaaaaaaaa&num == 0
}
Runtime: 0 ms, faster than 100.00% of Go online submissions for Power of Four.
Memory Usage: 2.1 MB, less than 100.00% of Go online submissions for Power of Four.
递归
https://leetcode.com/problems/power-of-four/discuss/384752/Shortest-than-shortest
var isPowerOfFour = function (num) {
if (num === 1) {
return true
}
if (num === 0) {
return false
}
return (num % 4 === 0 && isPowerOfFour(num / 4));
};
Runtime: 60 ms, faster than 96.41% of JavaScript online submissions for Power of Four.
Memory Usage: 35.7 MB, less than 100.00% of JavaScript online submissions for Power of Four.
Last updated
Was this helpful?