Given a non-negative integer num
, repeatedly add all its digits until the result has only one digit.
Example:
Input:38
Output: 2 Explanation: The process is like:3 + 8 = 11
,1 + 1 = 2
. Since2
has only one digit, return it.
Follow up:
Could you do it without any loop/recursion in O(1) runtime?
题意就是把一个数的每一位相加,如果得到的和大于10,则对和的每一位继续相加,直到最后结果是小于10的。得到的这个数称为数根。 题目要求用O(1)的算法实现,要求好高啊,完全懵*,还是先实现一个常规的迭代算法吧:
class Solution2 {
public:
int addDigits(int num)
{
int sum = num;
while (sum > 9) {
int cur_sum = 0;
while (sum) {
cur_sum += sum % 10;
sum = sum / 10;
}
sum = cur_sum;
}
return sum;
}
};
本代码提交AC,用时3MS。
后来网上搜索了一下,发现数根有规律,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,所以为了一行搞定,可以用(n-1)%9+1来包括所有的情况。
完整代码如下:
class Solution {
public:
int addDigits(int num)
{
return (num – 1) % 9 + 1;
}
};
本代码提交AC,用时3MS。