美文网首页
Swift - LeetCode - 3 的幂

Swift - LeetCode - 3 的幂

作者: 晨曦的简书 | 来源:发表于2022-08-28 20:46 被阅读0次

题目

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

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

示例 1:

  • 输入: n = 27
  • 输出: true

示例 2:

  • 输入: n = 0
  • 输出: false

示例 3:

  • 输入: n = 9
  • 输出: true

示例 4:

  • 输入: n = 45
  • 输出: false

提示:

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

方法一:试除法

思路及解法

我们不断地将 n 除以 3,直到 n=1。如果此过程中 n 无法被 3 整除,就说明 n 不是 3 的幂。

本题中的 n 可以为负数或 0,可以直接提前判断该情况并返回 \text{False},也可以进行试除,因为负数或 0 也无法通过多次除以 3 得到 1

代码

class Solution {
    func isPowerOfThree(_ n: Int) -> Bool {
        if n <= 0 {
            return false
        }

        var n = n
        while n % 3 == 0 {
            n /= 3
        }

        return n == 1
    }
}

复杂度分析

  • 时间复杂度:O(\log n)。当 n3 的幂时,需要除以 3 的次数为 \log_3 n = O(\log n);当 n 不是 3 的幂时,需要除以 3 的次数小于该值。

  • 空间复杂度:O(1)

方法二:判断是否为最大 3 的幂的约数

思路及解法

我们还可以使用一种较为取巧的做法。

题目要求不能使用循环或递归来做,而传参 n 的数据类型为 int,这引导我们首先分析出 int 范围内的最大 3 次幂是多少,约为 3^{19} = 1162261467

如果 n3 的幂的话,那么必然满足 n * 3^k = 1162261467,即 n1162261467 存在倍数关系。

因此,我们只需要判断 n 是否为 1162261467 的约数即可。

与方法一不同的是,这里需要特殊判断 n 是负数或 0 的情况。

注意:这并不是快速判断 x 的幂的通用做法,当且仅当 x 为质数可用。

代码

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

复杂度分析

  • 时间复杂度:O(1)

  • 空间复杂度:O(1)

相关文章

网友评论

      本文标题:Swift - LeetCode - 3 的幂

      本文链接:https://www.haomeiwen.com/subject/qtfxnrtx.html