【leetcode】258. 各位相加(简单)题解学习

题目描述:

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

示例 1:

输入: num = 38

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

示例 2:

输入: num = 0
输出: 0

提示:

  • 0 <= num <= 231 - 1

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

class Solution {
    public int addDigits(int num) {

    }
}

代码实现:

方法一:模拟法

最直观的方法是模拟各位相加的过程,直到剩下的数字是一位数。

计算一个整数的各位相加的做法是,每次计算当前整数除以 101010 的余数得到最低位数,将最低位数加到总和中,然后将当前整数除以 101010。重复上述操作直到当前整数变成 000,此时的总和即为原整数各位相加的结果。

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

作者:力扣官方题解
链接:https://leetcode.cn/problems/add-digits/solutions/1301157/ge-wei-xiang-jia-by-leetcode-solution-u4kj/

方法二:

这个问题可以使用很巧妙的数学方法来解决,叫做数字根(digital root)。数字根是一个数学属性,它是将一个非负整数的各个位上的数字相加,然后重复这个过程,直到得到的结果是个位数为止。

实际上,数字根就是对 9 取余(除非这个数本身就是 9 的倍数,此时数字根为 9)。

下面是一个 Java 方法的实现:

class Solution {
    public int addDigits(int num) {
        if (num == 0) {
            return 0;
        }
        return (num - 1) % 9 + 1;
    }
}

在上面的代码中,首先处理了特殊情况,即当输入参数为 0 时,直接返回 0。

对于其他情况,我们使用了 (num - 1) % 9 + 1 来计算数字根。这个表达式的含义是:如果 num - 1 是 9 的倍数,那么结果就是(0) + 1,否则就是 (num - 1) % 9 + 1

你可能感兴趣的:(leetcode,算法,leetcode,学习,算法)