1.Add Digits

此为在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 = 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?

翻译为中文之后题目的意思就是,输入为一个正整数,然后经过让其各个数位上的数字相加,然后再让这个结果的各个位上数字相加直到相加的结果是个位数。并要求时间复杂度为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  result  num  result
0      0      10   1
1      1      11   2
2      2      12   3
3      3      13   4
4      4      14   5
5      5      15   6
6      6      16   7
7      7      17   8
8      8      18   9
9      9      19   1

可以发现输出与输入的关系为:

result = (num - 1) % 9 + 1

这个结果与直接对num取模的唯一差别在只有当num是9的倍数的时候变成了9而不是0,所以先让num-1对9取模之后再加1即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值