阿姆斯特朗数

Submission

运行时间: 23 ms

内存: 15.8 MB

class Solution:
    def isArmstrong(self, n: int) -> bool:
        k = len(str(n))
        sum = 0

        for i in str(n):
            sum += int(i)**k
        
        return sum == n

Explain

这个题解的核心思路是首先计算数字 n 的位数 k,然后遍历 n 的每一位数字,把每一位数字的 k 次幂求和。最后,判断这个幂和是否等于原数字 n。如果相等则表示该数字是阿姆斯特朗数(即每个位上的数字的 k 次幂之和等于该数本身)。

时间复杂度: O(k)

空间复杂度: O(k)

class Solution:
    def isArmstrong(self, n: int) -> bool:
        k = len(str(n))  # 计算数字 n 的位数
        sum = 0  # 初始化幂和为 0

        for i in str(n):  # 遍历数字 n 的每一位
            sum += int(i)**k  # 计算当前位的 k 次幂并加到 sum
        
        return sum == n  # 如果幂和等于原数 n,返回 True,否则返回 False

Explore

在这个算法中,首先通过将数字 n 转换为字符串来计算它的位数 k,这个过程是准确的因为字符串的长度直接反映了数字的位数。之后,遍历字符串的每一个字符,每个字符都代表 n 的一个具体的数字位。通过对字符使用 int() 函数转换成整数,然后再进行 k 次幂的计算,这样可以确保每位数字被正确地计算了它的 k 次幂。Python 的 int 类型和幂运算都是精确的,因此可以保证计算的正确性。

当处理非常大的数字时,这种方法的效率可能会受到影响,因为大数字意味着更多的位数,每一位的 k 次幂计算也相应增多,且每次幂运算的成本随着数字的增大而上升。优化这一过程可以考虑预计算并存储小数字的 k 次幂结果,尤其是当 k 是固定的或者有限范围内变动时。此外,使用更快的幂运算算法,如快速幂算法,也可能帮助提高计算大数的 k 次幂的效率。

当前的算法实现没有直接处理 n 为负数的情况,如果 n 是负数,算法依然会计算每位数字的 k 次幂并求和,但最后的比较会失败,因为负数的幂和不可能等于原始的负数值。要扩展算法以包括负数,需要重新定义阿姆斯特朗数对负数的含义,或者简单地在算法开始时检查 n 的符号,如果 n 为负则直接返回 False,因为按照传统定义,阿姆斯特朗数只考虑非负整数。