LeetCode 258. Add Digits
題目
Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.
For example:
Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit, return it.
Follow up:
Could you do it without any loop/recursion in O(1) runtime?
翻譯
將一個數字每個位數相加,直到剩個位數為止。
範例:
num = 38,則 3+8 = 11,1+1 = 2, 2是個為數,回傳2。
進階:
不用迴圈,遞迴解這個問題
思路
取出每個位數的值,例如說38 -> [3,8],然後將取出的數字相加,如果大於等於10,重複動作直到數字小於10。
解題
方法一
var addDigits = function(num) {
while(num >= 10){
var n = num;
var sum = 0;
// 取出每個位數的值
// ex. n = 138, 138%10 = 8, sum = 8, n = 13
// n = 13, 13%10 = 3, sum =11, n = 1
while(parseInt(n/10) > 0){
sum += parseInt(n%10);
n = parseInt(n/10);
}
// sum = 11, n = 1, sum + n%10 = 12,
num = parseInt(n%10) + sum;
}
return num;
};
方法二
var addDigits = function(num) {
while(num >= 10){
var sum = 0;
// 將數字轉成字串並切開放在陣列 ex. 138 => [1,3,8]
(''+num).split('').forEach(function(v){
sum += parseInt(v);
});
num = sum;
return num;
};
進階
這已經是偏向數學的範圍,怎麼證明這邊就跳過了,麻煩自己上網搜尋, 簡單說就是判斷一個數是否為9的倍數,可以從每個位數相加是否能被9整除直接判斷,運用這樣的想法,直接取這個數除9的餘數。
var addDigits = function(num) {
if(num == 0) return 0;
if(num%9==0) return 9;
return num%9;
};