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:
- 题目的中文翻译是本人所作,如有偏差敬请指正。
- 其中的“个人分析”和“个人解法”均是本人最初的想法和做法,不一定是对的,只是作为一个对照和记录。