326. 3 的幂
给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true
;否则,返回 false
。
整数 n
是 3 的幂次方需满足:存在整数 x
使得 n = = 3 x n == 3^x n==3x。
示例 1:
输入:n = 27
输出:true
示例 2:
输入:n = 0
输出:false
示例 3:
输入:n = 9
输出:true
示例 4:
输入:n = 45
输出:false
提示:
- − 2 31 < = n < = 2 31 − 1 -2^{31} <= n <= 2^{31} - 1 −231<=n<=231−1
进阶: 你能不使用循环或者递归来完成本题吗?
思路:
法一:数学
一个不能再朴素的做法是将 n
对 3 进行试除
- 如果
n
小于等于0, 或者不能被 3 整除,一定不是 3 的幂;
法二(进阶):倍数 & 约数
在题目给定的 32 位有符号整数的范围内,最大的 3 的幂为 3 19 = 1162261467 3^{19} = 1162261467 319=1162261467。
- 我们只需要判断 n 是否是 3 19 3^{19} 319 的 约数 即可。
- 也要判断是否
n
小于等于0,只要n
大于0时才有可能。
代码:(Java、C++)
法一:数学
Java
public class IsPowerOfThree {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n = 27;
System.out.println(isPowerOfThree(n));
}
public static boolean isPowerOfThree(int n) {
while(n != 1) {
if(n % 3 != 0 || n <= 0) {
return false;
}
n /= 3;
}
return true;
}
}
C++
class Solution {
public:
bool isPowerOfThree(int n) {
while(n != 1) {
if(n % 3 != 0 || n <= 0) {
return false;
}
n /= 3;
}
return true;
}
};
法二(进阶):倍数 & 约数
Java
class Solution {
public boolean isPowerOfThree(int n) {
return n > 0 && (1162261467 % n == 0);
}
}
C++
class Solution {
public:
bool isPowerOfThree(int n) {
return n > 0 && (1162261467 % n == 0);
}
};
运行结果:
复杂度分析:
- 时间复杂度:法一: O ( log 3 n ) O\left(\log _{3} n\right) O(log3n);法二: O ( 1 ) O(1) O(1)。
- 空间复杂度: O ( 1 ) O(1) O(1)。
题目来源:力扣。
放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!