258. 各位相加
題目
解析
這道題有兩種解法,第一種很簡單,就是用迴圈模擬操作過程,不多解釋,直接上程式碼.
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;
}
}
相關文章
- Add Digits 各位相加Git
- LeetCode每日一題: 各位相加(No.258)LeetCode每日一題
- [LeetCode] 258. Add DigitsLeetCodeGit
- 影像相加 Mean
- 兩數相加Ⅰ和Ⅱ
- Leetcode兩數相加LeetCode
- LeetCode——兩數相加LeetCode
- Add Strings 字串相加字串
- LeetCode-兩數相加LeetCode
- 2. 兩數相加
- LeetCode-415-字串相加LeetCode字串
- PHP字串數字相加PHP字串
- python中列表相加Python
- 【leetcode】【2、兩數相加】LeetCode
- LeetCode 2——兩數相加LeetCode
- 【LeetCode】2 兩數相加LeetCode
- 神奇補0解決連結串列相加:LeeCode002兩數相加
- 454_四數相加Ii
- 移位相加乘法器
- leetcode 2. 兩數相加LeetCode
- LeetCode 2.兩數相加LeetCode
- Facebook 面試題 | 字串相加面試題字串
- 演算法-兩數相加演算法
- LeetCode題集-2 - 兩數相加LeetCode
- 程式設計題-兩數相加程式設計
- LeetCode 第二題兩數相加LeetCode
- 各位 PHPer,Serverless 正當時PHPServer
- [LeetCode 刷題] 2. 兩數相加LeetCode
- 一元稀疏多項式相加
- leetcode之兩數相加解題思路LeetCode
- 力扣題解2-兩數相加力扣
- js精確計算浮點數相加JS
- 找到相加等於2021的等差數列
- LeetCode2: Add two numbers(兩數相加)LeetCode
- 漫畫:如何實現大整數相加?
- python 詭異問題求助各位大哥Python
- 各位大專生們工作咋樣?
- 演算法--力扣2. 兩數相加演算法力扣