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

各位相加(简单)

2020年6月9日

题目来源:力扣

在这里插入图片描述

解题

  • 循环法

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

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

在这里插入图片描述

  • 模九法

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

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

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

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41541562/article/details/106635899