LeetCode 258: Add Digits 题解

刚开始以为是一道水题,一下就过了,结果题没看完,要求时间复杂度为 O(1)

LeetCode 258: Add Digits
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?

用循环或者递归的话在思想上很简单,下面是水过的代码:

int addDigits(int num) {
    while(num >= 10){
        int temp_sum = 0;
        while(num > 0){
            temp_sum += num % 10;
            num /= 10;
        }
        num = temp_sum;
    }
    return num;
}

下面来看看怎么不用循环或者递归来解这道题。

解法1:

这道题其实是有规律的:

n 结果
10 1
11 2
12 3
13 4
14 5
15 6
16 7
17 8
18 9
19 1
20 2
21 3


答案就是对9取余,但是9的倍数取余为0,所以要处理特殊情况:

int addDigits(int num) {
    return (num != 0 && 0 == num % 9) ? 9 : num % 9;
}

解法2:

下面的例子引用自该题的discussion

首先需要知道:
10^k % 9 = 1
a*10^k % 9 = a % 9

假如有一个数字 x = 23456

x = 2* 10000 + 3 * 1000 + 4 * 100 + 5 * 10 + 6

2 * 10000 % 9 = 2 % 9

3 * 1000 % 9 = 3 % 9

4 * 100 % 9 = 4 % 9

5 * 10 % 9 = 5 % 9

那么x % 9 = ( 2+ 3 + 4 + 5 + 6) % 9, 注意 x = 2* 10000 + 3 * 1000 + 4 * 100 + 5 * 10 + 6

所以有: 23456 % 9 = (2 + 3 + 4 + 5 + 6) % 9

所以解法就是取各位数相加,然后对9取余,其实和第一种解法本质上是相同的,同样需要9的倍数需要特殊处理。

你可能感兴趣的:(LeetCode,题解,258,AddDigits)