此为在leetcode做的第一道题目,原题目如下:
Given a non-negative integer num
, repeatedly add all its digits until the result has only one digit.
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),不用递归或循环。
我编写的代码如下,提交之后通过。
public int addDigits(int num) {
int a=0;
int sum=0;
while(num!=0){
a= num%10;
num=num/10;
sum=sum+a;
if(sum>=10){
sum=1+sum%10;
}
}
return sum;
}
分析思路:
一开始拿到题目并且要求是线性复杂度并且不让用递归,确实有点害怕,但是仔细分析之后发现题目并不是很难。
以输入正整数123456789为例,不难发现从1加到6与从6加到1对结果并没有什么影响,所以为实现代码方便我是从低位开始加。在数字加的过程发现,对后两位9+8=17来说,它们对最后结果的影响是1+7=8,所以9+8之后可以直接处理成8而不是17,在下一位相加的时候直接用之前的结果8加7计算即可,然后重复上一步,知道加到最高位1。
方法二:
根据题目中描述可知输出的结果只能是0--9中的一个
使用方法I的代码循环输出0 - 19的运行结果:
可以发现输出与输入的关系为:
这个结果与直接对num取模的唯一差别在只有当num是9的倍数的时候变成了9而不是0,所以先让num-1对9取模之后再加1即可。