解法一(用到了循环,不符合题目要求):
public class Solution {
public boolean isPowerOfThree(int n) {
for(int i = 0; ;i++){
if(Math.pow(3, i) == n){
return true;
}
if(Math.pow(3, i) > n){
return false;
}
}
}
}
解法二:
public class Solution {
public boolean isPowerOfThree(int n) {
//因为在int范围内,所以可以找出所有3的幂
HashSet<Integer> set = new HashSet<>(Arrays.asList(1, 3, 9, 27, 81, 243, 729, 2187,
6561, 19683, 59049, 177147, 531441, 1594323,
4782969, 14348907, 43046721, 129140163, 387420489, 1162261467));
return set.contains(n);
}
}
解法三:
public class Solution {
public boolean isPowerOfThree(int n) {
//判断一个数是否是3的幂,那么就可以通过计算log3(n)是否为整数来判断
//由于没有直接的log3(n)这个函数,所以通过换底公式
if(n <= 0) return false;//特殊情况单独处理
if(Math.abs(Math.log(n) / Math.log(3) - Math.ceil(Math.log(n) / Math.log(3)))
> 0.00000000000001){//取对数有一个误差,要考虑在内
return false;
}
else{
return true;
}
}
}
最优解:
public class Solution {
public boolean isPowerOfThree(int n) {
//如果一个数是3的幂,那么这个数的因子也是3的幂,3^(a+b)=3^a * 3^b
//所以在int范围内用最大的3^19来对n求余,如果n是3的幂,那么余数就是0
//如果一个数的因子不是3的幂,那么这个数就不是3的幂
//所以余数也就不为0
// 1162261467 is 3^19, 3^20 is bigger than int
//return (n >= 0 && 1162261467 % n == 0); 不对,若n为0,后面会有除0的情况发生
return (n > 0 && 1162261467 % n == 0);
}
}