跳转至

326. 3 的幂

题目描述

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

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

 

示例 1:

输入:n = 27
输出:true

示例 2:

输入:n = 0
输出:false

示例 3:

输入:n = 9
输出:true

示例 4:

输入:n = 45
输出:false

 

提示:

  • -231 <= n <= 231 - 1

 

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

解法

方法一:试除法

思考

判断 \(n\) 是否为 \(3\) 的幂。连乘直到溢出再比较亦可,但试除更直接:在 \(n>2\) 时若不能被 \(3\) 整除则否,否则除以 \(3\)。最终只剩 \(1\) 则为是。\(n\le 1\) 的情况自然落到最后的相等判断。

如果 \(n \gt 2\),我们可以不断地将 \(n\) 除以 \(3\),如果不能整除,说明 \(n\) 不是 \(3\) 的幂,否则继续除以 \(3\),直到 \(n\) 小于等于 \(2\)。如果 \(n\) 等于 \(1\),说明 \(n\)\(3\) 的幂,否则不是 \(3\) 的幂。

时间复杂度 \(O(\log_3n)\),空间复杂度 \(O(1)\)

1
2
3
4
5
6
7
class Solution:
    def isPowerOfThree(self, n: int) -> bool:
        while n > 2:
            if n % 3:
                return False
            n //= 3
        return n == 1
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class Solution {
    public boolean isPowerOfThree(int n) {
        while (n > 2) {
            if (n % 3 != 0) {
                return false;
            }
            n /= 3;
        }
        return n == 1;
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class Solution {
public:
    bool isPowerOfThree(int n) {
        while (n > 2) {
            if (n % 3) {
                return false;
            }
            n /= 3;
        }
        return n == 1;
    }
};
1
2
3
4
5
6
7
8
9
func isPowerOfThree(n int) bool {
    for n > 2 {
        if n%3 != 0 {
            return false
        }
        n /= 3
    }
    return n == 1
}
1
2
3
4
5
6
7
8
9
function isPowerOfThree(n: number): boolean {
    while (n > 2) {
        if (n % 3 !== 0) {
            return false;
        }
        n = Math.floor(n / 3);
    }
    return n === 1;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
impl Solution {
    pub fn is_power_of_three(mut n: i32) -> bool {
        while n > 2 {
            if n % 3 != 0 {
                return false;
            }
            n /= 3;
        }
        n == 1
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
/**
 * @param {number} n
 * @return {boolean}
 */
var isPowerOfThree = function (n) {
    while (n > 2) {
        if (n % 3 !== 0) {
            return false;
        }
        n = Math.floor(n / 3);
    }
    return n === 1;
};

方法二:数学

思考

试除需 \(O(\log n)\) 次除法。\(32\) 位内最大 \(3\) 的幂为 \(3^{19}=1162261467\),正整数 \(n\)\(3\) 的幂当且仅当它整除该值。一次取模即可。

如果 \(n\)\(3\) 的幂,那么 \(n\) 最大是 \(3^{19} = 1162261467\),因此我们只需要判断 \(n\) 是否是 \(3^{19}\) 的约数即可。

时间复杂度 \(O(1)\),空间复杂度 \(O(1)\)

1
2
3
class Solution:
    def isPowerOfThree(self, n: int) -> bool:
        return n > 0 and 1162261467 % n == 0
1
2
3
4
5
class Solution {
    public boolean isPowerOfThree(int n) {
        return n > 0 && 1162261467 % n == 0;
    }
}
1
2
3
4
5
6
class Solution {
public:
    bool isPowerOfThree(int n) {
        return n > 0 && 1162261467 % n == 0;
    }
};
1
2
3
func isPowerOfThree(n int) bool {
    return n > 0 && 1162261467%n == 0
}
1
2
3
function isPowerOfThree(n: number): boolean {
    return n > 0 && 1162261467 % n == 0;
}
1
2
3
4
5
impl Solution {
    pub fn is_power_of_three(mut n: i32) -> bool {
        n > 0 && 1162261467 % n == 0
    }
}
1
2
3
4
5
6
7
/**
 * @param {number} n
 * @return {boolean}
 */
var isPowerOfThree = function (n) {
    return n > 0 && 1162261467 % n == 0;
};

评论