一、題目介紹
給定一個非負整數 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;
}
};