[LeetCode] Add Digits 加数字
Given a non-negative integer num
, repeatedly add all its digits until the result has only one digit.
Example:
38
3 + 8 = 11
1 + 1 = 2
2
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.
这道题让我们求数根,所谓树根,就是将大于10的数的各个位上的数字相加,若结果还大于0的话,则继续相加,直到数字小于10为止。那么根据这个性质,我们可以写出一个解法如下:
解法一:
class Solution { public: int addDigits(int num) { while (num / 10 > 0) { int sum = 0; while (num > 0) { sum += num % 10; num /= 10; } 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 == 0) ? 0 : (num - 1) % 9 + 1; } };
类似题目:
参考资料:
https://leetcode.com/problems/add-digits/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具