1. 程式人生 > >LeetCode演算法題-Add Digits(Java實現-3種解法)

LeetCode演算法題-Add Digits(Java實現-3種解法)

這是悅樂書的第199次更新,第207篇原創

01 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第63題(順位題號是258)。給定非負整數num,重複新增其所有數字,直到結果只有一位數。例如:

輸入:38

輸出:2

說明:過程如下:3 + 8 = 11,1 + 1 = 2。由於2只有一位數,所以請將其返回。

跟進:你可以在O(1)執行時間內沒有任何迴圈/遞迴的情況下執行此操作嗎?

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 第一種解法

特殊情況:如果num小於10,直接返回num即可。

正常情況:此解法是利用遞迴,因為每計算一次後得到的結果還是相同的問題。因為題目給定的是正整數,所以可以藉助字串來操作。先將num轉為字串,然後依次獲取字元相加,得到每位數的和,然後繼續呼叫自身。

public int addDigits(int num) {
    if (num < 10) {
        return num;
    }
    String str = num+"";
    int sum = 0;
    for (int i=0; i<str.length(); i++) {
        sum += str.charAt(i)-'0';
    }
    return addDigits(sum);
}

03 第二種解法

特殊情況:如果num小於10,直接返回num即可。

正常情況:此解法是利用迭代,使用兩層迴圈,外層判斷大小,內層進行資料計算,先對10取餘,再除以10,進入下一位接著計算,如果算到最後一位,跳出內層迴圈,此時還要加上對10取餘的餘數,因為內層迴圈只是做判斷,然後將算出的和賦值給num,sum歸為0,再開始下一次的迴圈。

public int addDigits2(int num) {
    if (num < 10) {
        return num;
    }
    int sum = 0;
    while (num >= 10) {
        while (num/10 != 0) {
            sum += num%10;
            num /= 10;
        }
        sum += num%10;
        num = sum;
        sum = 0;
    }
    return num;
}

04 第三種解法

可以先計算一部分資料,找找規律。

9 --> 9 --> 9%9=0 ?

10 --> 1 --> 10%9=1

13 --> 4 --> 13%9=4

18 --> 9 --> 18%9=0 ?

19 --> 1 --> 19%9=1

22 --> 4 --> 22%9=4

25 --> 7 --> 25%9=7

27 --> 9 --> 27%9=0 ?

29 --> 2 --> 29%9=2

33 --> 6 --> 33%9=6

36 --> 9 --> 36%9=0 ?

37 --> 1 --> 37%9=1

39 --> 3 --> 39%9=3

43 --> 7 --> 43%9=7

45 --> 9 --> 45%9=0 ?

46 --> 1 --> 46%9=1

49 --> 4 --> 49%9=4

通過上面這些數的計算,可以發現最後計算出的結果是有周期的,從1到9不斷迴圈,並且除了9的倍數以外的數,其他的數都可以間接通過對9取餘得到最後的結果,但是以9為倍數的整數,我們可以曲線救國,將原數減1後再對其取餘,然後再把1補上。最後我們得到這樣的公式:(num-1)%9 + 1。

public int addDigits3(int num) {
    return (num-1)%9 + 1;
}

05 小結

演算法專題目前已連續日更超過一個月,演算法題文章63+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!