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+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!