文章目录
摘要
很多人刷题的时候,一看到“某个数是不是几的幂”,就第一时间想循环除。但其实这类题有很多巧办法,尤其是对于 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 的幂分别是 1、3、9、27、81...,没有包含 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);
- 如果题目加了“不允许循环或递归”,就可以考虑最大幂整除法。