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;
};

results matching ""

    No results matching ""