给定一个整数,写一个函数来判断它是否是 3 的幂次方。
示例 1:
输入: 27
输出: true
示例 2:
输入: 0
输出: false
示例 3:
输入: 9
输出: true
示例 4:
输入: 45
输出: false
第一个想到的是 将得到的数除3,如果为0则再除,如果不为0则代表不是3的幂
解法一:
var isPowerOfThree = function (n) {
while(n%3 === 0) {
n = n/3;
}
return n === 1;
};
虽然能算出正确结果,但是会报超时,这时可以尝试用二分法来解决。其查找方式如下图:
这个时候可以先算出在Number中最大可完整显示的3的幂
由此可以将最大值置为44来进行比较,代码如下:
var isPowerOfThree = function (n) {
let right = 44;
let left = 0;
while (left < right) {
const mid = ~~((right + left) / 2);
if (n > Math.pow(3, mid)) {
left = mid + 1;
} else {
right = mid;
}
}
return Math.pow(3, left) === n;
};
最终结果: