LeetCode - 258. Add Digits

题目链接:258. Add Digits


题意:给你一个非负整数,将这个数的每一位拆开进行求和计算,直到只剩一位数为止。
例:num = 38,先对num进行拆分,38,求和为11,再拆分11,求和为22就是最终的结果。
另:你能在不使用循环/递归的情况下,用O(1)的时间复杂度求出结果吗?


简单的解法,也就是使用循环求解的方法:

class Solution(object):
    def addDigits(self, num):
        if num == 0: return num
        while True:
            s = 0
            while num > 0:
                s += num % 10
                num //= 10
            num = s
            if num < 10:
                break

        return num

原谅我对python的知识的了解的浅薄程度,只能写出这么难看的代码了,但是效果凑活吧。


接下来重点介绍一下,不用循环和递归的特殊解法。
算法讲解

这张图片来源于维基百科的一篇文章:Digital root
关于算法的具体讲解过程,可以参看这篇文章。当然这个题目如果列出一些例子,也可以推测出这个规律。这里就不多展开了,我个人认为这种东西更偏向于基础知识点。

上代码:

class Solution(object):
    def addDigits(self, num):
        return (num - 1) % 9 + 1 if num != 0 else 0 

one-liner

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值