Letecode:258. 各位相加
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
示例:
输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-digits
这道题用循环和判断就很快能完成,但是进阶有些难度,需要先仔细分析下。
第一步(如何代替循环、递归):我们假设一个三位数num
,各个位数分别位a
,b
,c
,那么num=a*100+b*10+c*1
,按照题意,我们是想要得到各个位相加,也就是s=a+b+c
,发现他们的差值num-s=99*a+9+b
是一个绝对能被9整除的数,也就是说num
可以写成num=99*a+9*b+a+b+c
,也就是说s=num%9
。这里有人可能会问,那得到的a+b+c
如果大于9,不是还要重复上面的一次操作吗?,仔细想,如果s>9
, 那么在之前那个num%9
这步就已经继续被整除掉了,即从a+b+c
中,继续打包9,余下的只能是不能被9整除的部分。相当于继续递归了结果。所以最终得到的结果和题意是一样的.
第二步(1个问题):接着上面,还可能出现一种情况,如果s=9
呢,也就是说如果num
能被9整除,我们只能得到s=0
。这里的思路是故意给num-1
,这样和第一步的做法就一样了(num-1)%9
,实际也就是可以想成这样:num=99*a+9*b+a+b+c-1
,(99*a+9*b)
部分被9打包掉了,剩下的a+b+c+1
不能被9整除所以s=a+b+c-1
,但是还少了1,所以要加1加回去.最总表达就是(num-1)%9+1
就是我们要的结果。
class Solution:
def addDigits(self, num: int) -> int:
return (num-1)%9+1 if num!=0 else 0 # 如果给的num是0 就直接返回0