LeetCode—各位相加(循环法+模九法)

各位相加(简单)

2020年6月9日

题目来源:力扣

LeetCode—各位相加(循环法+模九法)_第1张图片

解题

  • 循环法

最常见的做法,但题目要求不用循环或递归做

class Solution {
    public int addDigits(int num) {
        while(num>=10){
            num=num/10+num%10;
        }
        return num;
    }
}

LeetCode—各位相加(循环法+模九法)_第2张图片

  • 模九法

非常巧妙的数学,感觉许多题解写的并不好,按照自己的理解写一下

举个例子,num=461,那么我们可以按十进制进行分堆
LeetCode—各位相加(循环法+模九法)_第3张图片
这里我们可以数出是11个堆,那我们肯定不想这么数啊,我们可以发现
只要把100的堆减去99,10的堆减去9,加起来就是堆数了,写成数学公式就是下图所示,算出括号内的就是堆数
LeetCode—各位相加(循环法+模九法)_第4张图片
那好,4+6+1=11,还是个大于10的数,那我们可以再进行分堆,自然就是分成两堆了
LeetCode—各位相加(循环法+模九法)_第5张图片
此时发现1+1=2<10,正是我们要求的结果,那自然我们想的就会是把4X99+6X9+1X9给去掉,根据他们共同的特点,都是有9或99,我们会想到把整个数模九
LeetCode—各位相加(循环法+模九法)_第6张图片
这样我们就可以得到一个小于10的数了,正是我们要求的结果,但是有一个问题,如果我们的数是459呢
LeetCode—各位相加(循环法+模九法)_第7张图片
你会发现不对,4+5+9=18,1+8=9,答案是9,怎么变成0了?

那这里我们要对模9进行优化了,我们想让最后的9模9之后还是等于9,我们可以写成(9-1)%9+1=9
LeetCode—各位相加(循环法+模九法)_第8张图片
可能有些人会有疑惑,为什么这样不会对4X99和6X9也造成影响,我们可以拆成两部分看,减一的部分只在我最后的尾数部分减,并不影响前面的模九计算LeetCode—各位相加(循环法+模九法)_第9张图片
至此,我们可以推导出(num-1)%9+1就是我们要求的答案

class Solution {
    public int addDigits(int num) {
        return (num-1)%9+1;
    }
}

LeetCode—各位相加(循环法+模九法)_第10张图片

你可能感兴趣的:(LeetCode)