leetcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

* 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
*
* 示例:
*
* 输入: 38
* 输出: 2
* 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
* 进阶:
* 你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?
* X = 100*a + 10*b + c
* X = 99*a + 9*b + a + b + c
* X = 9*11*a + 9*b + a + b + c
* X = 9(11*a + b) + a + b + c
* X % 9 = a+b+c
* 567/9=63
* 63*9=567
*/
// 普通代码
class {
public int addDigits(int num) {
if(num < 10)return num;
int res = 0;
while(num>0){
res+=num%10;
num/=10;
}
return addDigits(res);
}
}
// 进阶代码
- X = f(abc)
- X = 100*a+10*b+c
- X = 99*a+9*b+a+b+c
- X = 9*(11*a+b)+a+b+c
- X = abc%9 = a+b+c
class {
public int addDigits(int num){
return (num-1)%9+1;
}
}