题目描述
题干:
给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。
整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3x
示例1:
输入:n = 27
输出:true
示例2:
输入:n = 45
输出:false
题解思路
判断是不是3的幂,一开始的思路就是循环判断,复杂度也不算太高,有一种理解是基于这种简单的方法,就是3进制的引入
如果是3进制的数,那么这个数字转换为10进制那么一定是10000……00,所以只要判断转换后最后一个数字是不是1即可这也就和最简单的写法不谋而合
在我看来会有人枚举解答的时候,有个方法确实眼前一亮,根据输入的参数是int,得到int的取值范围得到最大的3的幂是3的19次方
而且如果数字是3的幂的话,一定会是3的19次方的余数,这里就出现了最简单的写法
正确代码
//3进制
public boolean isPowerOfThree1(int n) {
int count = 0;
while (n >= 1) {
count += n % 3;
n /= 3;
}
return (count == 1) ? true : false;
}
//简单循环法
public boolean isPowerOfThree2(int n) {
if (n < 1) {
return false;
}
while (n % 3 == 0) {
n /= 3;
}
return n == 1;
}
//余数判断法
public static boolean isPowerOfThree3(int n) {
//2的19次方为1162261467
return n > 0 && 1162261467 % n == 0;
}
总结
这道题因为int的缘故范围不大,如果用传统方法操作更大的数字的话那就性能太低了,官方题解还有其他的数学方法可以提供参考
终究是有些方法不太明白搞懂,如果你想得到更高效的办法建议去阅读
如果文章存在问题或者有更好的题解,欢迎评论区斧正和评论,各自努力,你我最高处见