【題目】258. 各位相加
給定一個非負整數 num,反覆將各個位上的數字相加,直到結果爲一位數。
示例:
輸入: 38
輸出: 2
解釋: 各位相加的過程爲:3 + 8 = 11, 1 + 1 = 2。 由於 2 是一位數,所以返回 2。
進階:你可以不使用循環或者遞歸,且在 O(1) 時間複雜度內解決這個問題嗎?
【解題思路1】循環
class Solution {
public int addDigits(int num) {
while (num >= 10) {
int next = 0;
while (num != 0) {
next = next + num % 10;
num /= 10;
}
num = next;
}
return num;
}
}
【解題思路2】遞歸
class Solution {
public int addDigits(int num) {
if (num < 10) {
return num;
}
int next = 0;
while (num != 0) {
next = next + num % 10;
num /= 10;
}
return addDigits(next);
}
}
【解題思路3】數學方法
- n 是 0 ,數根就是 0。
- n 不是 9 的倍數,數根就是 n 對 9 取餘,即 n mod 9。
- n 是 9 的倍數,數根就是 9。
可以通過 (n-1) mod 9 + 1 這個式子把上邊的幾種情況統一起來。
class Solution {
public int addDigits(int num) {
return (num - 1) % 9 + 1;
}
}