力扣第23刷-各位相加

简介: 力扣第23刷-各位相加

Example 23

各位相加

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

示例 1:

输入: num = 38

输出: 2

解释: 各位相加的过程为:

38 --> 3 + 8 --> 11

11 --> 1 + 1 --> 2

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

示例 1:

输入: num = 0

输出: 0

解题思路:这道题的本质是计算自然数num 的数根。

数根又称数字根(Digital root),是自然数的一种性质,每个自然数都有一个数根。对于给定的自然数,反复将各个位上的数字相加,直到结果为一位数,则该一位数即为原自然数的数根。

计算数根的最直观的方法是模拟计算各位相加的过程,直到剩下的数字是一位数。利用自然数的性质,则能在O(1) 的时间内计算数根。

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

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

解题步骤:

1. 定义外部while循环,当num大于等于10时进入循环,说明还未处理完毕,否则说明num已经是个位数,已处理完毕,将num返回即可。

2. 在外部while循环中,定义变量sum存储该次处理过程中的各位之和,初始值设为0。

3. 定义内部while循环,当num大于0时,说明该次处理还未结束,进入循环,否则说明该次处理已经结束,各位之和已经存储到sum中,将sum的值赋给num,进行下一轮的判断处理。

4. 在内部while循环中,用num % 10,获取最后一位,累加到sum中,然后将num / 10,清除最后一位,再进行判断,num等于0时说明每一位都累加完毕,否则继续处理,直至每一位都累加完毕。

 

示例代码如下:

public class AddDigits {
    /**
     * 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
     * 示例 1:
     * 输入: num = 38
     * 输出: 2
     * 解释: 各位相加的过程为:
     * 38 --> 3 + 8 --> 11
     * 11 --> 1 + 1 --> 2
     * 由于2 是一位数,所以返回 2。
     * 示例 1:
     * 输入: num = 0
     * 输出: 0
     * 来源:力扣(LeetCode)
     * 链接:https://leetcode.cn/problems/add-digits
     */
    public static void main(String[] args) {
        AddDigits ad = new AddDigits();
        System.out.println(ad.addDigits(38)); // 2
    }
    /**
     * 官方
     *
     * @param num
     * @return
     */
    public int addDigits(int num) {
        while (num >= 10) {
            int sum = 0;
            while (num > 0) {
                sum += num % 10;
                num /= 10;
            }
            num = sum;
        }
        return num;
    }
    /**
     * 个人
     * @param num
     * @return
     */
    /*public int addDigits(int num) {
        String numStr = Integer.toString(num);
        while (numStr.length() != 1) {
            int tempNum = 0;
            for (int i = 0; i < numStr.length(); i++) {
                tempNum += Character.getNumericValue(numStr.charAt(i));
            }
            numStr = Integer.toString(tempNum);
        }
        return Integer.parseInt(numStr);
    }*/
}
相关文章
刷 leetcode三个数的最大乘积 | 刷题打卡
刷 leetcode三个数的最大乘积 | 刷题打卡
89 0
|
存储 算法
刷 整数反转 | 刷题打卡
刷 整数反转 | 刷题打卡
81 0
|
机器学习/深度学习 存储