题目:给定一个非负整数num, 重复将其各个位数上的数字进行求和操作,直到结果为1-9的数(个位数)为止。
比如: 给出num = 38 , 计算过程如下: 3 + 8 = 11 , 1 + 1 = 2, 因为2 为个位数, 返回。
要求:在 不用循环或递归的情况下,时间复杂度为O(1) ?
一开始,没什么思路,就手动计算几个数看看。
输入:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20......
输出: 1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2.......
可以看出,输出结果为9个一循环,所以自然而然想到 以9为底,取余。但这样,9,18,这种9的倍数就为0了,所以要单独加个条件判断。
代码如下:
public class Solution {
public int addDigits(int num) {
if (num < 0 ) return -1;
if (num % 9 == 0 ) return 9 ;
return num % 9;
}
}
这样觉得有点麻烦,看看有没有更高效简短的代码,通过查询讨论区中各大神的方法,看到一种很棒的解法。
public class Solution {
public int addDigits(int num) {
if (num < 0 ) return -1;
return 1 + (num - 1)%9;
}
}
通过减1,加1的方式很好的避免了数为9的倍数时,取余为0的尴尬。