Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.

Example:

Input: 38
Output: 2
Explanation: 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:

  1. A naive implementation of the above process is trivial. Could you come up with other methods?
  2. What are all the possible results?
  3. How do they occur, periodically or randomly?
  4. You may find this Wikipedia article useful.

这道题让我们求数根,所谓树根,就是将大于10的数的各个位上的数字相加,若结果还大于0的话,则继续相加,直到数字小于10为止。那么根据这个性质,我们可以写出一个解法如下:

解法一:

class Solution {
public:
int addDigits(int num) {
while (num / > ) {
int sum = ;
while (num > ) {
sum += num % ;
num /= ;
}
num = sum;
}
return num;
}
};

但是这个解法在出题人看来又trivial又naive,需要想点高逼格的解法,一行搞定碉堡了,那么我们先来观察1到20的所有的树根:

1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8    
9    9    
10    1
11    2
12    3    
13    4
14    5
15    6
16    7
17    8
18    9
19    1
20    2

根据上面的列举,我们可以得出规律,每9个一循环,所有大于9的数的树根都是对9取余,那么对于等于9的数对9取余就是0了,为了得到其本身,而且同样也要对大于9的数适用,我们就用(n-1)%9+1这个表达式来包括所有的情况。还有个特殊情况需要考虑一下,当num为0的时候,那么就会出现 -1 % 9 的情况,这个其实挺烦人的,因为C++和Java会给出商0余-1的结果,而Python会给出商-1余8的结果,博主搜了一下,好像是说当有一个负数存在的时候,C++/Java会尽可能让商大一些,而Python会让商小一些,所以结果不统一就神烦,那么只好做个额外判断了,特殊处理一下0的情况就OK了,所以解法如下:

解法二:

class Solution {
public:
int addDigits(int num) {
return (num == ) ? : (num - ) % + ;
}
};

类似题目:

Happy Number

参考资料:

https://leetcode.com/problems/add-digits/

https://leetcode.com/problems/add-digits/discuss/68580/Accepted-C%2B%2B-O(1)-time-O(1)-space-1-Line-Solution-with-Detail-Explanations

LeetCode All in One 题目讲解汇总(持续更新中...)

最新文章

  1. UiAutomator环境搭建及详细操作
  2. QtCreator动态编译jsoncpp完美支持x86和arm平台
  3. 解读vmstat中的ACTIVE/INACTIVE MEMORY
  4. 全局变量 urllib模块 json模块
  5. Codeforces Round #309 (Div. 2) B. Ohana Cleans Up 字符串水题
  6. git如何ignore
  7. Bitmap 和Drawable 的区别
  8. iOS开发UI篇-懒加载、重写setter方法赋值
  9. 遍历GridView
  10. Java面试题合集(二)
  11. bzoj [HNOI2008]Cards
  12. openlayers4 入门开发系列之地图展示篇(附源码下载)
  13. 关于dom&bom
  14. C# Winform 中使用FTP实现软件自动更新功能
  15. Struts框架(6)---action接收请求参数
  16. 使用 vue-cli-service inspect 来查看一个 Vue CLI 3 项目的 webpack 配置信息(包括:development、production)
  17. KinectFusion测试
  18. 用Java批量重命名文件
  19. 2012 - AD GC全局编录服务器(Global Catalog)
  20. Javac语法糖之TryCatchFinally

热门文章

  1. The Java Enum: A Singleton Pattern [reproduced]
  2. 简简单单学会C#位运算
  3. 【转】Asp.net MVC定义短网址
  4. 翻译:使用 ASP.NET MVC 4, EF, Knockoutjs and Bootstrap 设计和开发站点 - 2
  5. .NET Core全面扫盲贴
  6. getJson
  7. android权限
  8. SSH中Action的单例与多例
  9. java访问修饰符
  10. 解决 Tomcat Server in Eclipse unable to start within 45 seconds 不能启动的问题