【题目】258. 各位相加
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
示例:
输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
进阶:你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?
【解题思路1】循环
class Solution {
public int addDigits(int num) {
while (num >= 10) {
int next = 0;
while (num != 0) {
next = next + num % 10;
num /= 10;
}
num = next;
}
return num;
}
}
【解题思路2】递归
class Solution {
public int addDigits(int num) {
if (num < 10) {
return num;
}
int next = 0;
while (num != 0) {
next = next + num % 10;
num /= 10;
}
return addDigits(next);
}
}
【解题思路3】数学方法
- n 是 0 ,数根就是 0。
- n 不是 9 的倍数,数根就是 n 对 9 取余,即 n mod 9。
- n 是 9 的倍数,数根就是 9。
可以通过 (n-1) mod 9 + 1 这个式子把上边的几种情况统一起来。
class Solution {
public int addDigits(int num) {
return (num - 1) % 9 + 1;
}
}