[LeetCode]258. Add Digits(把数各个位上的数字相加)

本文解析了LeetCode第258题Add Digits的解决方案,通过观察数字规律,给出了无需循环或递归的O(1)时间复杂度算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

258. 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.

Follow up:

Could you do it without any loop/recursion in O(1) runtime?
你能在没有任何循环/递归在O(1)运行时做出它吗?
  1. 首先用递归,这个方法最容易想到但不符合题意
    代码如下:
C++

class Solution {
public:
    int addDigits(int num) {
        int sum = 0;
        if(num < 10 && num >=0)
            return num;
        while(num > 0)
        {
            int temp = num%10;
            sum += temp;
            num /= 10;
        }
        while(sum >= 10)
            return addDigits(sum);
        return sum;
    }
};
  1. 查看博客http://www.cnblogs.com/mudao/p/5538105.html
    LeetCode上给的提示,维基百科的一篇文章:Digital root 也可以参考

    输入 0 1 2 3 4 5 6 7 8 9
    输出 0 1 2 3 4 5 6 7 8 9

    输入 10 11 12 13 14 15 16 17 18 19
    输出 1,2,3,4,5,6,7,8,9,1

    输入 20 21 22 23 24 25 26 27 28 29
    输出 2,3,4,5,6,7,8,9,1,2

    输入 30 31 32 33 34 35 36 37 38 39
    输出 3,4,5,6,7,8,9,1,2,3
    不难发现,除了0 以外,之后所有的数运行后输出是1-9循环
    结果=num对9取余,这同样适用于num=0的情况。
    但是18不符合情况,还存在问题,18%9=0,但18对应的结果应该是9(1+8=9),所以应该 结果=1 + (num-1)%9

    代码如下:

C++

int addDigits2(int num) {
        return 1+(num-1)%9;
    }
  1. 使用循环http://blog.youkuaiyun.com/sbitswc/article/details/47975581
    挺精妙的算法

代码如下:

C++

int addDigits1(int num) {
        while(num >= 10){
           num = (num/10)+num%10;
        }
        return num;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值