简介

数根就是指将一个数的各位数字相加之后得到一个数字,若该数大于等于10则继续该运算所得到的那个数。

例如:
158 –》 1+5+8=14 –》 1+4=5

O(n) 解法

就是按照树根的定义来做。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public int addDigits(int num) {
while(num>=10){
int [] tmp=getDigits(num);
num=0;
for(int i=0;i<tmp.length;i++){
num+=tmp[i];
}
}
return num;
}


public int[] getDigits(int num){
int tmp=num;
int [] digits=new int[(int)Math.log(num)];
int index=0;
while(tmp!=0){
digits[index]=tmp%10;
tmp=tmp/10;
index+=1;
}
return digits;
}

O(1)解法

树根有一些很巧妙的数学规律,使得该题可以在O(1)时间内完成。

例:

$12345=110000+21000+3100+410+5*1$

$$=19999+2999+399+49+5*0+(1+2+3+4+5)$$

我们发现一个数的各位数字之和和该数和9同余。

所以树根与原数也应该同余(当一个数为9的倍数时,树根即为9)、

1
2
3
4
5
6
7
8
9
10
11
public int addDigits(int num) {
if(num==0){
return 0;
}
if(num%9==0){
return 9;
}else{
return num%9;
}

}