leetcode258题 题解 翻译 C语言版 Python版

258. Add Digits

Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.

For example:

Given num = 38, the process is like: 3 + 8 = 111 + 1 = 2. Since 2 has only one digit, return it.

Follow up:
Could you do it without any loop/recursion in O(1) runtime?

258.加数字

给你一个非负整数num,重复把他的各位数字相加直到最后的结果只有一位数字。

例如:

给定num=38,这个过程就像:3+8=11, 1+1=2. 因为2只有一个数字,就返回他。

进一步的:

你能不用任何的循环和递归并且在O(1)的时间复杂度中完成吗?


思路:对于任意整数abcde...,对其某一位i,如果将i抽离出来视作个位数,抛弃了他的权重,这个过程是可以分解成重复减9的行为的。例如14,对十位数1来说,原先表示的是10,抽离出来后表示为1,这个过程是减9。那么34就可以看成3次减9。那么345呢?百位的3先抽离到十位,是减9的重复,再抽离到个位,也是减9的重复。所以总的来说,模9就是题目所述的操作的简化。不太一样的是,模9得到的结果是0-8,而题目中除0以外任何数经题目操作后得到的结果应该是1-9.所以如果模9后得到的是0那么应该改为9.

int addDigits(int num) {
    if (num==0) return 0;
    int i = num%9;
    return i==0?9:i;
}

class Solution(object):
    def addDigits(self, num):
        """
        :type num: int
        :rtype: int
        """
        if num == 0:return 0
        i = num % 9
        return i if i != 0 else 9


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值