258. 各位相加

weixin_34279579發表於2018-07-12

題目

5666077-d3b129de50c94599.png
題目

解析

這道題有兩種解法,第一種很簡單,就是用迴圈模擬操作過程,不多解釋,直接上程式碼.

public class Main {
    public static void main(String[] args) {
        Main main = new Main();
        System.out.println(main.addDigits(10));
    }

    public int addDigits(int num) {
        int sum = num;
        while (sum >= 10) {
            char[] cs = (sum + "").toCharArray();
            int x = 0;
            for (char c : cs) {
                x += (c - '0');
            }
            sum = x;
        }
        return sum;
    }
}

重點是題目後面說的,如何在O(1)時間複雜度內解決這個問題?

方法二:
另一個方法比較簡單,可以舉例說明一下。假設輸入的數字是一個5位數字num,則num的各位分別為a、b、c、d、e。
有如下關係:num = a * 10000 + b * 1000 + c * 100 + d * 10 + e
即:num = (a + b + c + d + e) + (a * 9999 + b * 999 + c * 99 + d * 9)
因為 a * 9999 + b * 999 + c * 99 + d * 9 一定可以被9整除,因此num模除9的結果與 a + b + c + d + e 模除9的結果是一樣的。
對數字 a + b + c + d + e 反覆執行同類操作,最後的結果就是一個 1-9 的數字加上一串數字,最左邊的數字是 1-9 之間的,右側的數字永遠都是可以被9整除的。
這道題最後的目標,就是不斷將各位相加,相加到最後,當結果小於10時返回。因為最後結果在1-9之間,得到9之後將不會再對各位進行相加,因此不會出現結果為0的情況。因為 (x + y) % z = (x % z + y % z) % z,又因為 x % z % z = x % z,因此結果為 (num - 1) % 9 + 1,只模除9一次,並將模除後的結果加一返回。
轉自http://my.oschina.net/Tsybius2014/blog/497645

上程式碼:

public class Solution {
    
    /**
     * 給定整數不斷將它的各位相加,直到相加的結果小於10,返回結果
     * @param num
     * @return
     */
    public int addDigits(int num) {
        return (num - 1) % 9 + 1;
    }
}

相關文章