Swift 解 LeetCode 326:两种方法判断是否是 3 的幂,含循环与数学技巧

发布于:2025-07-16 ⋅ 阅读:(17) ⋅ 点赞:(0)

在这里插入图片描述
在这里插入图片描述

摘要

很多人刷题的时候,一看到“某个数是不是几的幂”,就第一时间想循环除。但其实这类题有很多巧办法,尤其是对于 3 这种质数。今天这篇文章,我们就一起来聊聊怎么判断一个数是不是 3 的幂,不仅要搞清楚思路,还要学会用 Swift 写出干净、优雅的代码。

描述

题目很简单:

给定一个整数 n,请判断它是否是 3 的幂。

换句话说,如果存在整数 x,使得 n == 3^x,那么就返回 true,否则返回 false

示例

输入:n = 27
输出:true
解释:27 = 3^3
输入:n = 0
输出:false
解释:0 不能表示成任何 3 的幂
输入:n = 45
输出:false
解释:3 的幂分别是 1392781...,没有包含 45

题解答案

判断一个数是不是 3 的幂,有两种方式:

解法一:常规做法(循环除法)

func isPowerOfThree(_ n: Int) -> Bool {
    var n = n
    if n < 1 { return false }
    while n % 3 == 0 {
        n /= 3
    }
    return n == 1
}

解法二:进阶做法(数学技巧,不用循环)

func isPowerOfThree(_ n: Int) -> Bool {
    return n > 0 && 1162261467 % n == 0
}

1162261467 是 3 的最大幂次(在 Int32 范围内,即 3^19),只要这个值能被 n 整除,说明 n 是 3 的幂。

题解代码分析

解法一:循环除法

func isPowerOfThree(_ n: Int) -> Bool {
    var n = n
    if n < 1 { return false }
    while n % 3 == 0 {
        n /= 3
    }
    return n == 1
}

这个方法比较直观:

  • 先判断是否小于等于 0;
  • 然后一边除以 3,一边更新 n
  • 最终如果 n == 1,说明它是 3 的幂。

适合大多数初学者理解。

解法二:不用循环的数学法

func isPowerOfThree(_ n: Int) -> Bool {
    return n > 0 && 1162261467 % n == 0
}

这个方法利用了一个数学事实:

  • 在 32 位整数范围内,最大的 3 的幂是 3^19 = 1162261467
  • 如果一个数是 3 的幂,它一定可以整除 1162261467
  • 所以用取模来判断即可,不用任何循环或递归,效率极高。

示例测试及结果

print(isPowerOfThree(27))   // true,3^3
print(isPowerOfThree(0))    // false
print(isPowerOfThree(9))    // true,3^2
print(isPowerOfThree(45))   // false
print(isPowerOfThree(1))    // true,3^0
print(isPowerOfThree(243))  // true,3^5

运行结果:

true
false
true
false
true
true

时间复杂度

  • 解法一(循环除法): O(log₃(n)),每次除以 3
  • 解法二(数学法): O(1),常数级判断,效率最高

空间复杂度

  • 两种方法都不需要额外空间,属于 O(1) 常数级别。

总结

这题虽然是简单难度,但却是很多“幂类问题”的典型代表:

  • 循环除法是通用模板;
  • 取模法是进阶技巧,适用于质数幂判断(比如 2、3、5);
  • 如果题目加了“不允许循环或递归”,就可以考虑最大幂整除法。

网站公告

今日签到

点亮在社区的每一天
去签到