LeetCode 258. Add Digits 各位相加(Java)

题目:

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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值