题目:
Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.
Example:
Input: 38
Output: 2
Explanation: The process is like: 3 + 8 = 11, 1 + 1 = 2.
Since 2 has only one digit, return it.
Follow up:
Could you do it without any loop/recursion in O(1) runtime?
解答:
题目比较简单,逐位相加,直至个位数 return 即可
class Solution {
public int addDigits(int num) {
while(num/10!=0) {
int sum=0;
while(num!=0) {
sum+=num%10;
num=num/10;
}
num=sum;
}
return num;
}
}
但看到了他人更简洁的做法,即对 num 用9求余就是结果。
任意一个非负整数 ABCD,ABCD=A×1000+B×100+C×10+D,ABCD=(A+B+C+D)+(A×999+B×99+C×9),则ABCDE%9=(A+B+C+D+E)%9
将ABCD任意一位抽离出来视作个位数,抛弃它的权重,这个过程可以看做重复减9的行为。比如,非负整数10,将十位数1提取出视作个位数,即减一个9,非负整数20,将十位数2提取出视作个位数,就是减两个9。
因此模9就是题目的简化解法。但要注意一点,(A+B+C+D+E)%9若为1,则结果为0。模9得到的结果是0-8,而题目中除0以外任何数经题目操作后得到的结果应该是1-9,所以如果模9后得到的是0,那么应该改为9
class Solution {
public int addDigits(int num) {
if (num == 0){
return 0;
}
if (num % 9 == 0){
return 9;
}
else {
return num % 9;
}
}
}