Easy

题目描述

给定一个整数 n,如果它是 3 的幂次,则返回 true;否则,返回 false

如果存在整数 x 使得 n == 3^x,则认为 n 是 3 的幂次。

示例 1:

输入:n = 27
输出:true
解释:27 = 3^3

示例 2:

输入:n = 0
输出:false
解释:不存在 x 使得 3^x = 0

示例 3:

输入:n = -1
输出:false
解释:不存在 x 使得 3^x = -1

提示:

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

进阶: 你能不使用循环或者递归来解决这个问题吗?

解题思路

这道题有多种解法,我们来分析几种主要思路:

方法一:循环除法 最直观的方法是不断将 n 除以 3,如果 n 能被 3 整除就继续,直到 n 变成 1(说明是 3 的幂)或者不能被 3 整除(说明不是 3 的幂)。需要注意 n 必须大于 0。

方法二:递归 递归思路与循环类似,基础情况是 n = 1 返回 true,n < 1 或不能被 3 整除返回 false,否则递归检查 n/3。

方法三:数学技巧(推荐) 这是最优雅的解法。由于题目给定了 n 的范围是 32 位整数,我们可以找到这个范围内最大的 3 的幂次,即 3^19 = 1162261467。如果 n 是 3 的幂次,那么最大的 3 的幂次一定能被 n 整除(因为 3 是质数)。

这种方法的时间复杂度是 O(1),不使用循环或递归,完美符合进阶要求。首先检查 n > 0,然后检查 1162261467 % n == 0。

代码实现

class Solution {
public:
    bool isPowerOfThree(int n) {
        return n > 0 && 1162261467 % n == 0;
    }
};
class Solution:
    def isPowerOfThree(self, n: int) -> bool:
        return n > 0 and 1162261467 % n == 0
public class Solution {
    public bool IsPowerOfThree(int n) {
        return n > 0 && 1162261467 % n == 0;
    }
}
var isPowerOfThree = function(n) {
    return n > 0 && 1162261467 % n === 0;
};

复杂度分析

复杂度类型数学方法循环方法
时间复杂度O(1)O(log₃n)
空间复杂度O(1)O(1)

相关题目