给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
示例 1:
输入: num = 38
输出: 2
解释: 各位相加的过程为:
38 --> 3 + 8 --> 11
11 --> 1 + 1 --> 2
由于 2 是一位数,所以返回 2。
示例 1:
输入: num = 0
输出: 0
提示:
- 0 <= num <= 231 - 1
进阶:你可以不使用循环或者递归,在 O(1) 时间复杂度内解决这个问题吗?
分析:
方法1:模拟
将每一位相加,然后对相加后的结果继续进行操作,直到结果为一位数。迭代和递归都可以实现。
迭代:
时间复杂度:O(log n) n 为数字
空间复杂度:O(1)
class Solution {
public int addDigits(int num) {
//遍历,直到num为一位数
while(num / 10 > 0){
//记录结果
int sum = 0;
//遍历每一位,进行相加
while(num > 0){
sum += num % 10;
num /= 10;
}
num = sum;
}
return num;
}
}
递归:
时间复杂度:O(log n)
空间复杂度:O(log n)
class Solution {
public int addDigits(int num) {
//一位数
if(num / 10 == 0){
return num;
}
//记录结果
int sum = 0;
//遍历每一位,进行相加
while(num > 0){
sum += num % 10;
num /= 10;
}
//递归
return addDigits(sum);
}
}
方法2:数学
这道题求的值又被称作数字根,详见 数根_百度百科 (baidu.com) ,根据求根公式 (a-1) % 9+1 计算结果即可。
时间复杂度:O(1)
空间复杂度:O(1)
class Solution {
public int addDigits(int num) {
return (num - 1) % 9 + 1;
}
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-digits