leetcode: 258. Add Digits

本文针对LeetCode上的一道题目——加数问题进行了详细的解析。该题目要求将一个非负整数的所有位数反复相加直至结果仅剩一位数。文章首先提供了一种通过循环实现的解决方案,并在此基础上进一步探讨如何在O(1)的时间复杂度内解决该问题,最终给出了简洁高效的解法。

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

题目解析:

题目链接:https://leetcode.com/problems/add-digits/description/

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 = 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?

解题思路:

刚开始思路很常规,就是要不断取出整数位然后相加,一个多位数字num,num-num/10可以得到最后一位数值。代码如下:

class Solution {
public:
    int addDigits(int num) {
        int res = 0;
        while(num >= 10)
        {
            int q = num / 10;
            res+=(num-q*10);
            num = num / 10;
        }
        res += num;
        if(res >= 10)
        {
            return addDigits(res);//在vs里这里不用加return就可以,原因暂时未知,单步调试是会递归出来return res.
        }
        else
            return res;
    }
};


看后续要求不用递归迭代循环,在O(1)时间复杂度内完成。接下来有大神解答很详细,我不重复,引用过来。感谢这位同学:

http://www.cnblogs.com/grandyang/p/4741028.html

那么我们先来观察1到20的所有的树根:

1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8    
9    9    
10    1
11    2
12    3    
13    4
14    5
15    6
16    7
17    8
18    9
19    1
20    2

 

根据上面的列举,我们可以得出规律,每9个一循环,所有大于9的数的树根都是对9取余,那么对于等于9的数对9取余就是0了,为了得到其本身,而且同样也要对大于9的数适用,我们就用(n-1)%9+1这个表达式来包括所有的情况,所以解法如下:

 

解法二:

class Solution {
public:
    int addDigits(int num) {
        return (num - 1) % 9 + 1;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值