题目地址:https://leetcode-cn.com/problems/power-of-three/comments/
1. 题目
给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true
;否则,返回 false
。
整数 n
是 3 的幂次方需满足:存在整数 x
使得 n == 3x
输入 | 27 | 0 | 9 | 45 |
---|---|---|---|---|
输出 | true | false | true | false |
提示:-231 <= n <= 231 - 1 进阶:你能不使用循环或者递归来完成本题吗?
2. 解题思路
本题注意以下几点:
3x
是一个幂函数,所以肯定非负- 要求
x
为一个整数,所以n
的输入必须大于 0 n
为一个整数,即不存在x
为负数的情况319 = 1162261467 已经达到给定整数的最大值
[ ] 第一种思路:找出
n
以内所有质数(不包括 3),且n
不可以被这些整数整除。不建议采用,显然不是最优的方法- 第二种思路:因为 19 次方已经是最大值,那么依次循环判断即可
- 第三种思路:给定整数如果是 3 的幂次方,那 1162261467 一定可以被它整除
- 第四种思路:对于10进制数来说,10 的
n
次幂表达为 10,100,1000;对于 2 进制数来说,2 的n
次幂的二进制表达为 10, 100, 1000;显然,3 进制同理
总结:显然,第三种思路比较简洁,实现起来也最简单,下面我们就还是以第三种思路作为实现方式。第四种思路很标新立异,但实际上将整数字符串转换为三进制其实很花时间,另一个很多语言提供了进制转换函数,只包括二进制、八进制、十六进制,三进制这种还需要自己写处理逻辑。
3. Python3
class Solution:
def isPowerOfThree(self, n: int) -> bool:
return n > 0 and 1162261467 % n == 0
if __name__ == "__main__":
inputs = [0, 1, 3, 9, 27, 33, 54, 81]
s = Solution()
for i in inputs:
print(i, s.isPowerOfThree(i))
4. Java
class Solution {
public boolean isPowerOfThree(int n) {
return n > 0 && 1162261467 % n == 0;
}
public static void main(String[] args) {
Solution s = new Solution();
int inputs[] = new int[]{0, 1, 3, 9, 27, 33, 54, 81};
for (int i: inputs) {
System.out.println(i + " " +s.isPowerOfThree(i));
}
}
}
5. Scala
object Solution {
def isPowerOfThree(n: Int): Boolean = {
return n > 0 && 1162261467 % n == 0
}
def main(args: Array[String]): Unit = {
val inputs = List(0, 1, 3, 9, 27, 33, 54, 81)
inputs.foreach(i => println(i, isPowerOfThree(i)))
}
}
6. Go
import "fmt"
func isPowerOfThree(n int) bool {
return n > 0 && 1162261467 % n == 0
}
func main() {
var inputs = [...]int{0, 1, 3, 9, 27, 33, 54, 81}
for _, e := range inputs {
fmt.Println(e, isPowerOfThree(e))
}
}
7. C
#include <stdio.h>
#include <stdbool.h>
bool isPowerOfThree(int n) {
return n > 0 && 1162261467 % n == 0;
}
main() {
int i;
int a[] = {0, 1, 3, 9, 27, 33, 54, 81};
for (i = 0; i < sizeof(a) / sizeof(int); ++i) {
printf("%d, %d\n", a[i], isPowerOfThree(a[i]));
}
}
8. C++
#include <iostream>
using namespace std;
class Solution {
public:
bool isPowerOfThree(int n) {
return n > 0 && 1162261467 % n == 0;
}
};
int main() {
int inputs[] = {0, 1, 3, 9, 27, 33, 54, 81};
Solution s;
for (int i = 0; i < sizeof(inputs) / sizeof(int); ++i) {
cout << inputs[i] << ", "<< s.isPowerOfThree(inputs[i]) << endl;
}
return 0;
}