各位相加
难度:
标签:
题目描述
给定一个非负整数 num
,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
示例 1:
输入: num =38
输出: 2 解释: 各位相加的过程为: 38 --> 3 + 8 --> 11 11 --> 1 + 1 --> 2 由于2
是一位数,所以返回 2。
示例 2:
输入: num = 0 输出: 0
提示:
0 <= num <= 231 - 1
进阶:你可以不使用循环或者递归,在 O(1)
时间复杂度内解决这个问题吗?
代码结果
运行时间: 20 ms, 内存: 16.0 MB
// Java solution using Java Streams for a more functional approach
// This solution uses Java Streams to sum the digits
// Time complexity is O(log(num)) due to the number of digits
// Space complexity is O(1)
import java.util.stream.Stream;
public class Solution {
public int addDigits(int num) {
while (num >= 10) {
num = Stream.of(String.valueOf(num).split(""))
.mapToInt(Integer::parseInt)
.sum();
}
return num;
}
}
解释
方法:
这个题解采用了递归的思路。首先将整数转为字符串,然后遍历字符串的每一位,将其转为整数并累加到变量sum中。如果sum小于10,说明已经得到一位数,直接返回sum;否则递归调用addDigits函数,将sum作为新的输入,继续执行各位相加的操作,直到得到一位数为止。
时间复杂度:
O(n * logn)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在这个问题中选择使用递归而不是迭代进行各位相加的操作?
▷🦆
递归方法中,如果输入的数字非常大,递归深度是否会影响性能或导致栈溢出的风险?
▷🦆
该递归解法是否考虑了所有输入的边界情况,尤其是当输入为最小值0和最大可能值时的表现?
▷🦆
在将数字转换为字符串并遍历的过程中,是否存在更优的方法直接通过数学运算来处理,以减少字符串操作的开销?
▷