[LeetCode258] Add Digits 非负整数各位相加
2015-12-17 16:14
399 查看
题目:
Given a non-negative integer
For example:
Given
Follow up:
Could you do it without any loop/recursion in O(1) runtime?
Hint:
A naive implementation of the above process is trivial. Could you come up with other methods?
What are all the possible results?
How do they occur, periodically or randomly?
You may find this Wikipedia article useful.
中文(
有一个非负整数num,重复这样的操作:对该数字的各位数字求和,对这个和的各位数字再求和……直到最后得到一个仅1位的数字(即小于10的数字)。
例如:num=38,3+8=11,1+1=2。因为2小于10,因此返回2。
)
解题方法:
1.最好想到的方法不断对整数个位数相加直到小于10为止
2.O(1)的算法
另一个方法比较简单,可以举例说明一下。假设输入的数字是一个5位数字num,则num的各位分别为a、b、c、d、e。
有如下关系: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一次,并将模除后的结果加一返回。
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
2has only one digit, return it.
Follow up:
Could you do it without any loop/recursion in O(1) runtime?
Hint:
A naive implementation of the above process is trivial. Could you come up with other methods?
What are all the possible results?
How do they occur, periodically or randomly?
You may find this Wikipedia article useful.
中文(
有一个非负整数num,重复这样的操作:对该数字的各位数字求和,对这个和的各位数字再求和……直到最后得到一个仅1位的数字(即小于10的数字)。
例如:num=38,3+8=11,1+1=2。因为2小于10,因此返回2。
)
解题方法:
1.最好想到的方法不断对整数个位数相加直到小于10为止
public class Solution { public int AddDigits(int num) { int next = GetNext(num); while(next>=10) { next = GetNext(next); } return next; } public int GetNext(int num) { string s = num.ToString(); int sum = 0; for(int i = 0;i < s.Length;i++) { sum += s[i]-'0'; } return sum; } }
2.O(1)的算法
另一个方法比较简单,可以举例说明一下。假设输入的数字是一个5位数字num,则num的各位分别为a、b、c、d、e。
有如下关系: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 class Solution { /** * 给定整数不断将它的各位相加,直到相加的结果小于10,返回结果 * @param num * @return */ public int addDigits(int num) { return (num - 1) % 9 + 1; } }
相关文章推荐
- 微机原理上机第四次实验内容
- xib动态改变cell行高
- 如何选择使用的HTML标签
- 1058: [ZJOI2007]报表统计
- K-最近邻算法
- leetcode -- Surrounded Regions -- 典型题。BFS
- 自动化测试小实例
- Gradle学习笔记(二)
- Oracle 11g R2 64位在 win7 64位的安装流程图解
- hdu 4735Little Wish~ lyrical step~ 重复覆盖
- 信息学奥林匹克竞赛-津津的储蓄计划
- gdb 技巧学习
- 数据挖掘:K最近邻(KNN)算法的java实现
- SELECTOR
- shell脚本中导入mysql数据&&执行mysql语句
- Java输入输出流详解
- MathJax在IE中公式不解析
- java 读取ftp文件时特殊字符乱码
- PHPUnit测试私有属性和方法
- 半平面交总结and模板