Add Digits

Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.(给定一个非负整数num,重复加上它的所有数字直到结果只有一位数。)

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

1.个人分析
可理解为将一个非负整数num不断地进行拆解相加,直到相加的和为一位数,最后返回该数。

2.个人解法

int addDigits(int num) 
{
    int a, b;
    do
    {
        a =  num / 10;
        b = num % 10;
        num = a + b;
    }while(num >= 10);

    return num;
}

这种循环对非负整数进行整除与求余的方法是最容易想到的,但看题目提示中表示存在一种O(1)的方法,心想难道是用空间换时间或者是利用数学工具来求解,但限于有限的知识储备,自己无法想到是哪种具体的空间换时间方法或者数学方法。查看参考解法后发现果然是利用一种数学方法——同余定理。

3.参考解法

int addDigits(int num)
{    
    return (num % 9 == 0 && num/9 >= 1) ? 9 : num % 9;    
}

该方法利用了数学中的一个“同余定理”来进行计算数字根(digital root),该定理思想是:对于任何一个非负整数,总是能够被9整除,则它的数字根就是9,否则数字根为该整数对9进行取余的结果。

4.个人总结
对于某种时间复杂度为O(n)解法作进一步的改进大都是利用空间换时间和数学方法,不过如果并没有接触过相关的问题或数学工具,那就很难想出这种改进方法。

PS:

  • 题目的中文翻译是本人所作,如有偏差敬请指正。
  • 其中的“个人分析”和“个人解法”均是本人最初的想法和做法,不一定是对的,只是作为一个对照和记录。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值