leetcode
leetcode 951 ~ 1000
阿姆斯特朗数

阿姆斯特朗数

难度:

标签:

题目描述

代码结果

运行时间: 23 ms, 内存: 15.8 MB


/*
题目思路:
阿姆斯特朗数是一个n位数,其每个位上的数字的n次幂之和等于它本身。
例如,153是一个阿姆斯特朗数,因为1^3 + 5^3 + 3^3 = 153。

解决方案:
1. 将数字转为字符串以便迭代每个位数。
2. 使用Java Stream API计算每个位数的n次幂之和。
3. 比较这个和与原始数字是否相等。
*/
import java.util.stream.IntStream;

public class ArmstrongNumberStream {
    public static boolean isArmstrong(int N) {
        String num = Integer.toString(N);
        int n = num.length();
        int sum = num.chars()
                     .map(Character::getNumericValue)
                     .map(digit -> (int) Math.pow(digit, n))
                     .sum();
        return sum == N;
    }

    public static void main(String[] args) {
        int num = 153;
        System.out.println(isArmstrong(num)); // 输出: true
    }
}

解释

方法:

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

时间复杂度:

O(k)

空间复杂度:

O(k)

代码细节讲解

🦆
在计算数字 n 的位数和遍历每一位时,你是如何保证算法的正确性即每位数字确实被正确计算了它的 k 次幂?
在这个算法中,首先通过将数字 n 转换为字符串来计算它的位数 k,这个过程是准确的因为字符串的长度直接反映了数字的位数。之后,遍历字符串的每一个字符,每个字符都代表 n 的一个具体的数字位。通过对字符使用 int() 函数转换成整数,然后再进行 k 次幂的计算,这样可以确保每位数字被正确地计算了它的 k 次幂。Python 的 int 类型和幂运算都是精确的,因此可以保证计算的正确性。
🦆
这种方法在处理非常大的数字时的效率如何?有没有可能优化计算大数的 k 次幂的过程?
当处理非常大的数字时,这种方法的效率可能会受到影响,因为大数字意味着更多的位数,每一位的 k 次幂计算也相应增多,且每次幂运算的成本随着数字的增大而上升。优化这一过程可以考虑预计算并存储小数字的 k 次幂结果,尤其是当 k 是固定的或者有限范围内变动时。此外,使用更快的幂运算算法,如快速幂算法,也可能帮助提高计算大数的 k 次幂的效率。
🦆
这个解法中,如果输入的 n 是一个负数,算法会如何处理?是否可以将算法扩展到包括负数的情况?
当前的算法实现没有直接处理 n 为负数的情况,如果 n 是负数,算法依然会计算每位数字的 k 次幂并求和,但最后的比较会失败,因为负数的幂和不可能等于原始的负数值。要扩展算法以包括负数,需要重新定义阿姆斯特朗数对负数的含义,或者简单地在算法开始时检查 n 的符号,如果 n 为负则直接返回 False,因为按照传统定义,阿姆斯特朗数只考虑非负整数。

相关问题