🐕 给定一个整数,写一个函数来判断它是否是 3 的幂次方。
如果是,返回 true ;否则,返回 false 。
整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3的x次方
示例 1:
输入:n = 27
输出:true
示例 2:
输入:n = 0
输出:false
示例 3:
输入:n = 9
输出:true
示例 4:
输入:n = 45
输出:false
提示:
-2的31次方 <= n <= 2的31次方 - 1
进阶:
你能不使用循环或者递归来完成本题吗?
思路一:
一开始我是这么想的 for循环遍历
考虑到负数(-27 也算是吧…其实得-3的3次方才是-27 题目要求3的x次方
然后 int i = 3; i <= n || i<= -n ; i*=3
还是直接上代码吧 比较直观
public static boolean isPowerOfThree(int n) {
if(n == 1) {
return true;
}
for(int i = 3; i <= n || i<= -n ; i*=3) {
if(i == n || i == -n) {
return true;
}
}
return false;
}
第1号男嘉宾遗憾离场…
思路二:
那就不判断负数咯
上代码
public static boolean isPowerOfThree(int n) {
if(n == 1) {
return true;
}
for(int i = 3; i <= n; i*=3) {
if(i == n ) {
return true;
}
}
return false;
}
结果运行超时…
因为根本就无需判断int的边界值 修改后的继续上代码…
public static boolean isPowerOfThree(int n) {
if(n == 1) {
return true;
}
for(int i = 3; i <= 1162261467; i*=3) {
if(i == n ) {
return true;
}
}
return false;
}
思路三:
当n大于1 时
进入while循环
判断他是否 取余3 == 0
如果是则一直 除以3
当不符合取余3为0时 则证明当前已经为最终要判断的值了
如果此时这个数还不是1(3的幂次倍一直除以3结果为1)
则证明此数不是3的幂次倍
废话少说 直接上代码
public static boolean isPowerOfThree_1(int n) {
if(n > 1) {
while( n % 3 == 0) {
n /= 3;
}
}
return n == 1;
}
思路四:
递归调用 最后n除到最后要 等于 1
上代码
public static boolean isPowerOfThree_2(int n) {
return n > 0 && (n == 1 || n % 3 == 0 && isPowerOfThree_2(n/3));
}
思路五:
在int范围内3的最大幂是1162261467
在比他大就超过int表示的范围了
我们直接用它对 n 求余即可,如果求余的结果是 0,说明 n 是 3 的幂次方
上代码
public static boolean isPowerOfThree_3(int n) {
return n > 0 && 1162261467 % n == 0;
}
思路六:Math函数
上代码
public static boolean isPowerOfThree_4(int n) {
return ( Math.log10(n) / Math.log10(3)) % 1 == 0;
}
我之前还没用过这个函数呢,而且做算法题用函数好像有点作弊的感觉…