各位相加-leetcode解题

各位相加 Add Digits 题述

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。

示例:

输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?

解题思路及代码

思路一 使用循环解题 :使用循环或递归来解决这个问题是很简单的,只需要 把 输入的非负整数 转变成 字符串
然后 每个字符 取出来 再以 int类型相加 ,
判断加和后的位数,如果不是一位,
再循环一次上面做的事情。这个代码就懒得写了。。

思路二 不使用循环解题 : 此时就需要找数据之间的关系了,
假设我们有个4位数, 1314, 1314= 1 x 1000+3 x 100+1 x 10+4 x 1
换个形式写 就是 1000 a +100 b +10 c + d
我们要求的是 a + b + c+d
这其中的关系就 比较明显了 , 他们相差 999a + 99 b + 9c
3位数: 100 a + 10 b +c
我们要求的是: a + b +c
相差 99 a + 9 b
2位数: 10a+b
要求的是 a+b
相差 9a
1位数: a
要求: a
相差: 0
由此可得一个规律,两位数以上,输入的非负整数 对 (它的位数-1)个9 求余 可初步得到我们要求的数。

因为我们不仅仅是要简单地把数的 各个位数相加 我们还要一直加,加到结果只是 一位数。
很明显 十以内的数字就是它本身了,但 像 999 或者 998 之类的数字,我们还要接着再运算,
像 999 这种 可以整除 9 的数属于特例, 它的结果肯定是9 ,所以不妨在一开始就将这类数分类处理,
像998 这样的数,在经过对 99 求余之后 ,所剩的数也不会超过两位了,
所以接下来还要对 9 求余数,就可得一位数的解了。

所以,代码思路就是:
输入非负整数num,
先判断,如果 num 大于等于 10:
如果 num 能整除 9
返回 9
如果不能:
就除以 num 最高位数-1 个 9 求其余数
如果余数大于十:
再除一次9
如果余数不大于10:
返回 余数
如果 num 不大于 10:
返回 num

class Solution:
    def addDigits(self, num: int) -> int:
    #先判断,如果 num 大于等于 10:
        if num >=10:
        #如果 num 能整除 9 
            if num%9==0:
                return 9
            else:
            #除以   num 最高位数-1 个 9  求其余数
                str1 = str(num)
                lenth9 = len(str1) - 1
                str2 = '9' * lenth9
                int9 = int(str2)
                res = num % (int9)
                #如果余数大于十:
                if res>=10:
                #再除一次9
                    return (res%9)
                else:
                    return res
        else:
            return num

附图:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值