leetcode: 258. Add Digits

来源:互联网 发布:国外数据库有哪些 编辑:程序博客网 时间:2024/05/29 11:36

题目解析:

题目链接: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;    }};


原创粉丝点击