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?
首先说一下我的思路,因为题目要求时间复杂度为1,所以不能使用循环,所以我就想到使用递归算法,但是递归算法的复杂度也不是1,我的代码如下:
public class Solution {
public int addDigits(int num) {
if(num / 10 == 0) return num;
return addDigits(change(num));
}
public static int change(int num) {
if(num == 0) return num;
return num % 10 + change(num / 10);
}
}
之后我在网上搜了一下最简单的算法,发现才有一行,这个算法如下:
public int addDigits(int num) {
return (num - 1) % 9 + 1;
}
这个算法是通过观察,来的出来的结论,每个数的最后结果是以9为一趟循环,
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
16 7
17 8
18 9
19 1
这个就是规律,很明显。