题目描述:
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
示例:
输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-digits
解法:
class Solution {
public int addDigits(int num) {
while (num > 9) {
int a = num % 10;//让num不断除以10,并取得余数
int b = num / 10;//就可以让该数字的非各位的数字变成个位
num = a + b; //将余数和商相加后,再赋值给num,直到num小于10
}
return num;
}
}
进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?
进阶解法:
class Solution {
public int addDigits(int num) {
if (num == 0) return 0;
else return num % 9 == 0 ? 9 : num % 9;
}
}
进阶思路分析,来源题解,用自己语言复述。
假设一个大于9的数,就拿题目给的例子38,计算过程就是3+8=11,1+1=2。计算过程我们可以理解为,38这个数,它的十位上的3,其实代表的是3个10,在计算过程中每一个10拿出一个1来和末位求和计算,每一个10剩一个9,。那可以拿出几个1呢? (30%9=3),也就是3个1。
那我们的计算其实就成了30%9+8%9=11,1%9+1%9=2。
它就等价为38%9=2。
但是需要注意的是,如果这个数是9的倍数,比如81,72,这些数直接对9取余是0,所以需要分别讨论,而且我们都知道,9的倍数的各个位数相加等于9
所以最终,我们写成 return num % 9 == 0 ? 9 : num % 9;当然n=0的情况要单独讨论