258. Add Digits
题目:
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?
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.
链接: http://leetcode.com/problems/add-digits/
题解:
又是数学题,求digital root。循环叠加比较容易,但看了wiki以后发现了公式,还是用公式算吧。这种数学题对数学不好的我来说真是头大。原理10 % 9 或者 100 % 9都等于 1 % 9。举个例子n = abc = a * 100 + b * 10 + c,那么 (a*100 + b * 10 + c) % 9 = (a + b + c) % 9。由此n == 0时,result = 0, n % 9 == 0时, 说明a + b + c = 9,我们返回9,对于其他数字, (a + b + c)等于res % 9。
Time Complexity - O(1), Space Complexity - O(1)
public class Solution {
public int addDigits(int num) {
return 1 + (num - 1) % 9;
}
}
二刷:
Java:
public class Solution {
public int addDigits(int num) {
return 1 + (num - 1) % 9;
}
}
三刷:
发现前两刷其实并没有完全理解,也许就是看了discuss区的答案而已。为什么(a + b + c) mod 9 = (abc) mod 9, 真正用到的公式是modulo运算的分配和结合律。
1. (a + b) mod n = ((a mod n) + (b mod n)) mod n
2. (a * b) mod n = ((a mod n) * (b mod n)) mod n
假如一个数字的三位字符是abc,那么这个数等于 a * 100 + b * 10 + c, 根据分配律, (a * 100) mod 9 = ((a mod 9) * (100 mod 9)) mod 9 = a mod 9,b和c同理, 所以 (a * 100 + b * 10 + c) mod 9 = (a + b + c) mod 9。 我们还可以使用一个小技巧,再用一次分配律直接用 (num - 1) mod 9 + 1来得到结果,这样可以避免一些边界条件的判断。
public class Solution {
public int addDigits(int num) {
if (num == 0) {
return 0;
}
int res = num % 9;
return res == 0 ? 9 : res;
}
}
public class Solution {
public int addDigits(int num) {
return 1 + (num - 1) % 9;
}
}
Update:
public class Solution {
public int addDigits(int num) {
if (num <= 0) return 0;
return (num % 9 == 0) ? 9 : num % 9;
}
}
Reference:
https://en.wikipedia.org/wiki/Digital_root
https://en.wikipedia.org/wiki/Modulo_operation
https://leetcode.com/discuss/67755/3-methods-for-python-with-explains
https://leetcode.com/discuss/52122/accepted-time-space-line-solution-with-detail-explanations
https://leetcode.com/discuss/55910/two-lines-c-code-with-explanation
258. Add Digits的更多相关文章
- 258. Add Digits(C++)
258. Add Digits Given a non-negative integer num, repeatedly add all its digits until the result has ...
- LeetCode Javascript实现 258. Add Digits 104. Maximum Depth of Binary Tree 226. Invert Binary Tree
258. Add Digits Digit root 数根问题 /** * @param {number} num * @return {number} */ var addDigits = func ...
- LN : leetcode 258 Add Digits
lc 258 Add Digits lc 258 Add Digits Given a non-negative integer num, repeatedly add all its digits ...
- 【LeetCode】258. Add Digits (2 solutions)
Add Digits Given a non-negative integer num, repeatedly add all its digits until the result has only ...
- LeetCode 258. Add Digits
Problem: Given a non-negative integer num, repeatedly add all its digits until the result has only o ...
- (easy)LeetCode 258.Add Digits
Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. ...
- Java [Leetcode 258]Add Digits
题目描述: Given a non-negative integer num, repeatedly add all its digits until the result has only one ...
- 【LeetCode】258. Add Digits
题目: Given a non-negative integer num, repeatedly add all its digits until the result has only one di ...
- 【一天一道LeetCode】#258. Add Digits
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
随机推荐
- UserLogin
DAL: IUserDAL namespace Dal { /// <summary> /// This interface is defined for user functions. ...
- vim命令总结
前言 本文翻译自:http://bencrowder.net/files/vim-fu/,参考了VIM中文帮助. Google翻译结果和实际操作结果,对原文的部分内容重新整理,删除和添加了 部分内容并 ...
- ASP.NET操作WMI
WMI Functions from ASP.NET Introduction This article demonstrates how to use WMI in ASP.NET to cre ...
- yii2怎样写规则可以隐藏url地址里的控制器名字
yii2怎样写规则可以隐藏url地址里的控制器名字,例如现在的是***.com/site/index.html要变成***.com/index.html '<action:index>.h ...
- easyui toolbar 可以放在datagrid底下
html: <div class="easyui-tabs" style="height: 250px;" tools="#t_rank&quo ...
- Regex.Match 方法
Regex.Match 方法 在输入字符串中搜索正则表达式的匹配项,并将精确结果作为单个 Match 对象返回. 重载列表 (1) 在指定的输入字符串中搜索 Regex 构造函数中指定的正则 ...
- android退出登陆后,清空之前所有的activity,进入登陆主界面
如题: android退出登陆后,清空之前所有的activity,进入登陆主界面 在退出登陆时只需要增加一个intent标志 Intent intent_login = new Intent(); i ...
- mysql存储过程 OUT or INOUT argument 3 for routine
mysql存储过程出现: OUT or INOUT argument 3 for routine gotask.UserLogin is not a variable or NEW pseudo-va ...
- 2140: 稳定婚姻 - BZOJ
Description 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的姗姗和男友谈恋爱半年就 ...
- 【树形DP/搜索】BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会
1827: [Usaco2010 Mar]gather 奶牛大集会 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 793 Solved: 354[Sub ...