1.Add Digits

来源:互联网 发布:log4j.xml配置打印sql 编辑:程序博客网 时间:2024/05/17 07:36

此为在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  result0      0      10   11      1      11   22      2      12   33      3      13   44      4      14   55      5      15   66      6      16   77      7      17   88      8      18   99      9      19   1

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

result = (num - 1) % 9 + 1

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

0 0
原创粉丝点击