题目
给定一个整数,写一个函数来判断它是否是 的幂次方。如果是,返回 ;否则,返回 。
整数 是 的幂次方需满足:存在整数 使得
示例 1:
- 输入:
n = 27
- 输出:
true
示例 2:
- 输入:
n = 0
- 输出:
false
示例 3:
- 输入:
n = 9
- 输出:
true
示例 4:
- 输入:
n = 45
- 输出:
false
提示:
方法一:试除法
思路及解法
我们不断地将 除以 ,直到 。如果此过程中 无法被 整除,就说明 不是 的幂。
本题中的 可以为负数或 ,可以直接提前判断该情况并返回 ,也可以进行试除,因为负数或 也无法通过多次除以 得到 。
代码
class Solution {
func isPowerOfThree(_ n: Int) -> Bool {
if n <= 0 {
return false
}
var n = n
while n % 3 == 0 {
n /= 3
}
return n == 1
}
}
复杂度分析
-
时间复杂度:。当 是 的幂时,需要除以 的次数为 ;当 不是 的幂时,需要除以 的次数小于该值。
-
空间复杂度:。
方法二:判断是否为最大 3 的幂的约数
思路及解法
我们还可以使用一种较为取巧的做法。
题目要求不能使用循环或递归来做,而传参 的数据类型为 ,这引导我们首先分析出 范围内的最大 次幂是多少,约为 。
如果 为 的幂的话,那么必然满足 ,即 与 存在倍数关系。
因此,我们只需要判断 是否为 的约数即可。
与方法一不同的是,这里需要特殊判断 是负数或 的情况。
注意:这并不是快速判断 的幂的通用做法,当且仅当 为质数可用。
代码
class Solution {
func isPowerOfThree(_ n: Int) -> Bool {
return n > 0 && 1162261467 % n == 0
}
}
复杂度分析
-
时间复杂度:。
-
空间复杂度:。
网友评论