1.题目

给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。

整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3^x

示例:

  1. 输入:n = 27
  2. 输出:true
  3. 输入:n = 0
  4. 输出:false
  5. 输入:n = 9
  6. 输出:true
  7. 输入:n = 45
  8. 输出:false

提示:

  • -2^31 <= n <= 2^31 -1

进阶:

  • 你能不使用循环或者递归来完成本题吗?

2.思路

和之前2次幂类似,先来个最简单的:

  1. public boolean isPowerOfThree(int n) {
  2. if (n==1) {
  3. return true;
  4. }
  5. long a=1;//防止溢出
  6. while(true)
  7. {
  8. a=a*3;
  9. if (a==n) {
  10. return true;
  11. }
  12. if (a>n) {
  13. return false;
  14. }
  15. }
  16. }

当然也可以反向:

  1. public boolean isPowerOfThree(int n) {
  2. if (n < 1) {
  3. return false;
  4. }
  5. while (n % 3 == 0) {
  6. n /= 3;
  7. }
  8. return n == 1;
  9. }

递归:

  1. public boolean isPowerOfThree(int n) {
  2. return n > 0 && (n == 1 || (n % 3 == 0 && isPowerOfThree(n / 3)));
  3. }

接下来的是数学技巧~我是没想到:

  1. public boolean isPowerOfThree(int n) {
  2. return (Math.log10(n) / Math.log10(3)) % 1 == 0;
  3. }