力扣 第258題 各位相加
題目
給定一個非負整數 num,反覆將各個位上的數字相加,直到結果爲一位數。
示例:
輸入: 38
輸出: 2
解釋: 各位相加的過程爲:3 + 8 = 11, 1 + 1 = 2。 由於 2 是一位數,所以返回 2。
進階:
你可以不使用循環或者遞歸,且在 O(1) 時間複雜度內解決這個問題嗎?
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/add-digits
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
暴力版答案
循環求得各個位數的和
當求的和大於10,那麼,重新計算各個位數的和,直到和小於10爲止
//暴力版
//循環求得各個位數的和
//當求的和大於10,那麼,重新計算各個位數的和,直到和小於10爲止
public static int addDigits(int num) {
//如果num小於10,返回num
if (num < 10) {
return num;
}
int sum = 0;
for (; num >= 10; ) {
//將num的個位數賦值給i
int i = num % 10;
//num除以10的值 賦值給num
num = num / 10;
//累計求個位數的和
sum += i;
if (num < 10) {
//如果num小於10,則sum加上num,(與最高位數相加的和)
sum += num;
if (sum >= 10) {
//如果sum大於10,則賦值爲num,且sum賦值爲0
num = sum;
sum = 0;
}
}
}
return sum;
}
進階版答案
進階版,不用循環和遞歸
原理:最後結果只有一位數,那麼必然返回的是1~9
所以,num如果能夠被9整除,那麼返回結果就爲9
如果不能被9整除,返回結果就是num%9的餘數
//進階版,不用循環和遞歸
//原理:最後結果只有一位數,那麼必然返回的是1~9
//所以,num如果能夠被9整除,那麼返回結果就爲9
//如果不能被9整除,返回結果就是num%9的餘數
public static int addDigits2(int num) {
//如果num小於10,返回num
if (num < 10) {
return num;
}
int sum = num % 9;
if (sum == 0) {
return 9;
}
return sum;
}