【刷题】各位相加

简介: 【刷题】各位相加

题目描述


给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。


示例


示例 1:


输入: num = 38
输出: 2
解释: 各位相加的过程为:
38 --> 3 + 8 --> 11
11 --> 1 + 1 --> 2

由于 2 是一位数,所以返回 2。


示例 2:


输入: num = 0
输出: 0

提示:


0 <= num <= 2312^{31}231 - 1

进阶:


你可以不使用循环或者递归,在 O(1) 时间复杂度内解决这个问题吗?


解题思路


看题目描述看的我蒙了,示例看完就清晰多了。

给我的启发是,以后自己撸文章也尽量多给一些示例。这样能让读者清晰。

这道题的本质是计算自然数的数根。

树根的概念是这样的:树根是自然数的一种性质,每个自然数都有一个数根。对于给定的自然数,反复将各个位上的数字相加,直到结果为一位数,则该一位数就是原自然数的数根。

清楚了这个概念我们就可以利用解树根的方式来解这道题了。

我的思路是模拟各个位上数字相加的过程,直到剩下的数字是一位数。

即:每次计算当前整数除以10的余数得到最低位数,将最低位数加到总和中,然后再将当前整数除以 10。重复这个思路的操作,直到当前整数变成0的时候,这时的总和就是原整数各位相加的结果了。


AC代码


func addDigits(num int) int {
    for num >= 10 {
        sum := 0
        for ; num > 0; num /= 10 {
            sum += num % 10
        }
        num = sum
    }
    return num
}


运行结果


微信图片_20221112151324.jpg

微信图片_20221112151336.jpg


总结


了解基础概念之后再解题思路就清晰多了,在刷题的过程中有学到了不少新概念。


相关文章
|
6月前
|
存储 算法 测试技术
|
5月前
【LeetCode刷题】两数之和、两数相加
【LeetCode刷题】两数之和、两数相加
|
存储
每日一题(两数相加)
每日一题(两数相加)
|
前端开发 C语言 Cloud Native
【刷题日记】2. 两数相加
本次刷题日记的第 6 篇,力扣题为:2. 两数相加 ,中等
|
Java Python
leetcode每日一题.445:两数相加II
leetcode每日一题.445:两数相加II
85 0
|
存储 算法 Go
【刷题】两数相加
【刷题】两数相加
104 0
【刷题】两数相加
|
算法 Go
【刷题】两数之和
【刷题】两数之和
【刷题】两数之和
|
存储
leetCode刷题 | 两数相加
leetCode刷题 | 两数相加
90 0