LeetCode 258——各位相加

一、題目介紹

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

示例:

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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/add-digits
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

二、解題思路

將給定的數,按位分開之後再進行求和,如果所求結果大於10,需要重複此過程,直到所求之和小於10。

三、解題代碼

class Solution {
public:
    int addDigits(int num) {
        int res = 0;
        while(num)
        {
            res += num%10;
            num /= 10;
        }
        return res < 10 ? res : addDigits(res);
    }
};

進階:
你可以不使用循環或者遞歸,且在 O(1) 時間複雜度內解決這個問題嗎? 

找規律:因爲10的整數倍都能拆分成(n*9+1),比如1000 可以拆分成(999+1)= (111 * 9 + 1),同理100可以拆分爲(11*9 + 1),這樣我們可以判斷給定的num是否是9的倍數,如果num%9 == 0,則最終的結果爲9,否則結果爲num%9。

class Solution {
public:
    int addDigits(int num) {
        if(num == 0)
            return 0;
        return num % 9 ? num % 9 : 9;        
    }
};

四、解題結果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章