Add Digits 各位相加

麥田裡的哈士奇發表於2018-11-11

給定一個非負整數 num,反覆將各個位上的數字相加,直到結果為一位數。

示例:

輸入: 38
輸出: 2 
解釋: 各位相加的過程為3 + 8 = 11, 1 + 1 = 2。 由於 2 是一位數,所以返回 2。

進階:
你可以不使用迴圈或者遞迴,且在 O(1) 時間複雜度內解決這個問題嗎?

思路:這道題的笨辦法就不說了,說一個discuss裡面很厲害的方法,可以實現O(1)的複雜度。具體idea為:

假設N=(a[0] * 1 + a[1] * 10 + ...a[n] * 10 ^n),其中 a[0]...a[n] 都是在 [0,9] 之間的數字

我們設:M = a[0] + a[1] + ..a[n]

因為:

1 % 9 = 1

10 % 9 = 1

100 % 9 = 1

所以 N % 9 = a[0] + a[1] + ..a[n]

意味著 N % 9 = M

所以 N = M (% 9)

但是 9%9 = 0,所以這裡我們使用一點小技巧來解決 9%9=0的問題,我們設定取餘操作為: (n - 1) % 9 + 1 

參考程式碼:

class Solution {
public:
    int addDigits(int num) {
        if (num == 0) return 0;
        return (num - 1) % 9 + 1;
    }
};

 

相關文章