258. 各位相加

108 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

一、题目描述:

258. 各位相加 - 力扣(LeetCode) (leetcode-cn.com)

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

示例 1:

输入: num = 38
输出: 2 
解释: 各位相加的过程为:
38 --> 3 + 8 --> 11
11 --> 1 + 1 --> 2
由于 2 是一位数,所以返回 2

示例 2:

输入: num = 0
输出: 0

提示:

  • 0 <= num <= 2^31 - 1  

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

二、思路分析:

这道题正常的思路是很好想的,但进阶要求不用递归和循环,O(1)复杂度:
一看到不用递归和循环而且又要O(1)复杂度,自然而然就想到了数学法。
数学法呢一定要先找规律试试!接下来是我找规律的思路:
我是先想了下最大的两位数99可以变成18然后变成9,98可以变成17然后变成8,
97可以变成16然后变成7,那么规律就来了,可以发现这个结果为7,8,9是连续的!
为了确认再从头开始看:
19 : 19;
1018 : 19;
1927 : 19 答案已经很明显了,当 n % 9 == 0 时 , 结果为 9 ; 其它时刻结果为 n % 9
再考虑特殊情况 n为0时,n % 9 == 0 但 结果应该为 0

三、AC 代码:

class Solution {
    public int addDigits(int num) {
        if(num == 0)
            return 0;
        return num % 9 == 0 ? 9 : num % 9;
    }
}

范文参考【儿须成名酒须醉】Python3+数学+脑筋急转弯 - 各位相加 - 力扣(LeetCode)

【Chthollist】Java 100%:简单模拟、数学公式 - 各位相加 - 力扣(LeetCode)

官方题解数学解法的剖析, 希望能让大家更容易明白 - 各位相加 - 力扣(LeetCode)