来自北大算法课的Leetcode题解:258. 各位相加

本文介绍了两种Python解法来计算一个整数的各位数字之和。解法1采用两重循环,逐步求和;解法2利用数学技巧,通过数字对9取余快速得到结果。这种方法对于O(1)复杂度的需求非常有效。

本题代码https://github.com/doubleZ0108/Leetcode/blob/master/258.%E5%90%84%E4%BD%8D%E7%9B%B8%E5%8A%A0.py

  • 解法1(T42% S57%): 基础做法,两重循环,外层不断循环直至唯一为止,里层不断循环%/逐位相加
  • 解法2(T97% S76%): 要求 O ( 1 ) O(1) O(1)解完,观察到比如一个三位数num(abc) = 100a+10b+c,而我们要求的是a+b+c,将num稍微变形num = 99a+9b+(a+b+c),因此只要num对9取余,剩下的部分就是a+b+c。当然还要特别判断下如果一个大于10的数正好是9的倍数,最终应该返回的是9
class Solution(object):
    def addDigits(self, num):
        """
        :type num: int
        :rtype: int
        """
        # 解法2
        if num < 10: return num
        return num % 9 if num%9!=0 else 9

    def otherSolution(self, num):
        # 解法1
        while num >= 10:
            tmp = num
            num = 0
            while tmp:
                num += tmp % 10
                tmp //= 10
        return num
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

doubleZ0108

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值