3 的幂

标签: 递归 数学

难度: Easy

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

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

示例 1:

输入:n = 27
输出:true

示例 2:

输入:n = 0
输出:false

示例 3:

输入:n = 9
输出:true

示例 4:

输入:n = 45
输出:false

提示:

  • -231 <= n <= 231 - 1

进阶:你能不使用循环或者递归来完成本题吗?

Submission

运行时间: 40 ms

内存: 16.1 MB

class Solution:
    def isPowerOfThree(self, n: int) -> bool:
        if n == 0 or n%2 == 0:return False
        while n%3 == 0:n = n//3
        return n == 1

Explain

这个题解的思路是首先检查输入的整数是否为0或者偶数,如果是,则直接返回False,因为0和偶数都不可能是3的幂次方。接着,使用一个循环不断地将n除以3,直到n不能被3整除。最后,如果n变为1,那么说明原始的n是3的幂次方,返回True;否则,返回False。

时间复杂度: O(log3(n))

空间复杂度: O(1)

class Solution:
    def isPowerOfThree(self, n: int) -> bool:
        if n == 0 or n%2 == 0: return False  # 检查n是否为0或偶数
        while n%3 == 0: n = n//3  # 不断将n除以3
        return n == 1  # 如果最后n为1,则说明是3的幂次方

Explore

检查n是否为偶数的逻辑在这个题解中是错误的。3的幂次方总是奇数。例如,3^0=1, 3^1=3, 3^2=9, 3^3=27等都是奇数。因此,一个数如果是偶数,它确实不能是3的幂次方,但检查偶数的步骤应该是不需要的,因为3的任何幂次方不会是偶数。

0确实是一个偶数,但在检查是否为3的幂次方的上下文中,0的处理应该与其他偶数分开。0不是3的幂次方,因为3的任何非负整数次幂都至少为1。0在这里应该单独检查并返回False,而不应该与偶数的检查合并。这是因为0是一个边界情况,具有唯一的性质,即它既不是正数也不是负数,不属于任何数的非零次幂。

题解中没有明确指出处理负数的情况,这是一个遗漏。实际上,负数也不能是3的幂次方,因为3的幂次方结果总是正数。如果输入n是负数,那么该方法应该立即返回False,而不是进入循环。如果不这样处理,循环将试图将负数除以3,这将导致n变得更小并继续是负数,从而永远不会等于1,循环将不正确地执行。