LeetCode 258 各位相加

2021-08-28 19:34:07 字數 1367 閱讀 4060

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

示例:

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

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

emmm, 拿到這道題, 瞬間就想到了迴圈的解法,感嘆,這是一道多麼簡單的題目,然後, 直接翻到高階的要求, 直接傻眼了,這要怎麼才能實踐o(1)?這裡面難道還有什麼深藏的數學不成。

/**

* 功能說明:leetcode 258 - add digits

* 開發人員:tsybius2014

*/public class solution

}

1. 這個解法,乍一看,我是懵的,憑什麼對9求餘,就可以直接得到結果了。所以,我就好好學習了一把。

有如下關係: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。

3. 我們可以繼續假設 num2 = ( a + b + c + d + e ),那麼這個num2的位數最大不超過兩位,不失一般性,這裡假設num2為2位數。

則根據第二步的推論,可得出: num2 = k1 * 10 + k2

即: num2 = (k1 + k2) + ( k1 * 9 )

最終得出:num2 % 9 == (k1 + k2) % 9, 那麼到這裡就比較明朗了,由於 (k1 + k2) < num2  ( k1 > 0 的情況下), 只要不斷迭代下去最終k1 + k2 < 10 的情況必定會出現,而我們需要保留的就是最終這個k1 + k2 的值。

4. 由以上的推到可以得出,num % 9 == (k1 + k2) % 9,且k1 + k2 < 10 的情況就是我們需要的結果。而當k1 + k2 < 9時, k1 + k2 % 9 == k1 + k2,但是這個式子並不能適應於k1 + k2 == 9的情況,所以修改了一下,就變成了( k1 + k2 - 1 ) % 9  + 1 的形式。轉換一下,就是(num - 1) % 9 + 1 == ( k1 + k2 - 1) % 9 + 1。

LeetCode 258 各位相加

題目描述 給定乙個非負整數num 反覆將各個位上的數字相加,直到結果為一位數。示例 輸入 38 輸出 2 解釋 各位相加的過程為 3 8 11,1 1 2。由於 2 是一位數,所以返回 2。解題思路 輸入的數為非負數,當輸入的數為個位數的時候不用疊加直接輸出 ac 1 int adddigits i...

LeetCode 258 各位相加

給定乙個非負整數num,反覆將各個位上的數字相加,直到結果為一位數。示例 輸入 38輸出 2解釋 各位相加的過程為 3 8 11,1 1 2。由於2是一位數,所以返回 2。class solution def adddigits self,num type num int rtype int sum...

LeetCode 258 各位相加

以下 如無說明均在力扣上c 語言執行通過 題目位址 給定乙個非負整數num,反覆將各個位上的數字相加,直到結果為一位數。高階 你可以不使用迴圈或者遞迴,且在 o 1 時間複雜度內解決這個問題嗎?首先用常規的思路想,肯定是要用到迴圈的,首先計算出給定數字的各位之和,然後再看得到的結果,如果該結果不為一...