题目:
Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.
For example:
Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit, return it.
Follow up:
Could you do it without any loop/recursion in O(1) runtime?
解决:
① 将每位数相加,直到它们的和为个位数为止。耗时3ms。
public class Solution {
public int addDigits(int num) {
while(num > 9){
int sum = 0;
while(num > 0){
sum += (num % 10);
num /= 10;
}
num = sum;
}
return num;
}
}
②我们先来观察1到20的所有的树根:
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 1
11 2
12 3
13 4
14 5
15 6
16 7
17 8
18 9
19 1
20 2
根据上面的列举,我们可以得出规律,每9个一循环,所有大于9的数的树根都是对9取余,那么对于等于9的数对9取余就是0了,为了得到其本身,而且同样也要对大于9的数适用,我们就用(n-1)%9+1这个表达式来包括所有的情况,所以解法如下,耗时2ms:
public class Solution {
public int addDigits(int num) {
if (num <= 9) {
return num;
}
return (num -1) % 9 + 1;
}
}
③ 同一个思路
public class Solution {
public int addDigits(int num) {
return num % 9 == 0 ? (num == 0 ? 0 : 9) : num % 9;
}
}