Letecode:258. 各位相加

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值