题目:
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
示例:
输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?
思路一:
正常逻辑思路进行遍历
class Solution {
public int addDigits(int num) {
//确保小于10的时候退出条件,而不是为负数退出条件
while(num>=10){
int sum=0;
while(num>0){//处理个位数相加 也就是个位数不等于0或者大于0退出
sum=sum+num%10;
num=num/10;
}
num=sum;
}
return num;
}
}
思路二:
通过思路一的迭代思路
转换思路二的递归思路
注意其中的区别
class Solution {
public int addDigits(int num) {
//确保小于10的时候退出条件,而不是为负数退出条件
if(num<10)return num;
int sum=0;
while(num>0){//处理个位数相加 也就是个位数不等于0或者大于0退出
sum=sum+num%10;
num=num/10;
}
num=sum;
return addDigits(num);
}
}
思路三:
模9做法
class Solution {
public int addDigits(int num) {
return (num - 1) % 9 + 1;
}
}
具体流程操作可看这篇文章
LeetCode—各位相加(循环法+模九法)