美文网首页ACM题库~
[LeetCode-Easy]Add Digits-把位数相加直

[LeetCode-Easy]Add Digits-把位数相加直

作者: AceCream佳 | 来源:发表于2016-08-21 07:37 被阅读61次

题目:

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?

思路:

题意在标题里写清楚了。有种思路可行:即我们把数字转型为字符串,判断字符串的长度,如果不为1,就获取各个位数,转回整形相加。一直循环直到只有一位,以下为代码:

     public int addDigits(int num) {
     String numString = String.valueOf(num);
     int sum = 0;
     int result = 0;
     String s = "";
     while (numString.length() != 1) {
         result = 0;
        for(int i=0;i<numString.length();i++) {
            s = numString.charAt(i)+"";
            sum = Integer.parseInt(s);
            result = result + sum;
        }
        numString = String.valueOf(result);
        num = result;
    }
     return num;
  }

但是我们发现此方法,非常臃肿,时间复杂度不低,题目中最后有挑战不用循环和递归。所以查阅资料后学习到另外一种方法!下面是引用,感谢原作者~~

有如下关系:num = a * 10000 + b * 1000 + c * 100 + d * 10 + e
即:num = (a + b + c + d + e) + (a * 9999 + b * 999 + c * 99 + d * 9)
因为 a * 9999 + b * 999 + c * 99 + d * 9 一定可以被9整除,因此num模除9的结果与 a + b + c + d + e 模除9的结果是一样的。
对数字 a + b + c + d + e 反复执行同类操作,最后的结果就是一个 1-9 的数字加上一串数字,最左边的数字是 1-9 之间的,右侧的数字永远都是可以被9整除的。
这道题最后的目标,就是不断将各位相加,相加到最后,当结果小于10时返回。因为最后结果在1-9之间,得到9之后将不会再对各位进行相加,因此不会出现结果为0的情况。
因为 (x + y) % z = (x % z + y % z) % z,又因为 x % z % z = x % z,因此结果为 (num - 1) % 9 + 1,只模除9一次,并将模除后的结果加一返回。

所以,这种方法掌握后是十分简便轻松的。

代码:

public int addDigits(int num) {
    return (num - 1) % 9 + 1;
}

相关文章

  • [LeetCode-Easy]Add Digits-把位数相加直

    题目: Given a non-negative integer num, repeatedly add all ...

  • Day35

    Add Digits思路:不能用循环,一个数的各位数相加,直到相加的和不超过10or x or y 布尔"或"...

  • 258.[每位数相加] Add Digits

    这是一个微信群传过的一种流行的算术,把自然数所有的位上的值不断加到就剩一位, 但不能使用循环。 Given a n...

  • 常用汇编指令

    ADD指令ADD{条件}{S} 目标寄存器,操作数1,操作数2ADD 指令用于把两个操作数相加,并将结果放入目的寄...

  • 关于“高效增员,倍增团队”的四个主题内容的介绍

    流年流月 ———增员不能忽略的话题 把生日的月和日相加,再加上今年的年份数字,一直加到个位数,看...

  • IL指令字典

    Add 将两个值相加并将结果推送到计算堆栈上。Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆...

  • 数字和-2019 年大沥镇信息学初中组试题

    题目描述 对于一个正整数 X,把它的各位数字相加得到一个新的整数,如果新的整数大于等于 10,继续把它的各位数字相...

  • JS实现add(1)(2)(3)(4)的调用方式

    1.第一种 这个add函数可以无限次调用循环调用,并且把所有传进去的值相加,最后返回相加总数。这道题咋一看有点特别...

  • 2020-05-12 JS实现add(1)(2)(3)(4)的调

    1.第一种 这个add函数可以无限次调用循环调用,并且把所有传进去的值相加,最后返回相加总数。这道题咋一看有点特别...

  • ORCALE常用函数

    1、时间函数 注意点:日期与日期之间不能相加 ,日期与数字就可相加。 函数:1.Add_Months(D,X) :...

网友评论

    本文标题:[LeetCode-Easy]Add Digits-把位数相加直

    本文链接:https://www.haomeiwen.com/subject/opnisttx.html