力扣第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);
    }*/
}
相关文章
|
小程序 测试技术 uml
电商小程序01需求分析
电商小程序01需求分析
|
7月前
|
前端开发
鸿蒙开发:使用Circle绘制圆形
绘制矩形也好,圆形也好,大家做为一个了解即可,在有需要用到的场景中,合理的使用即可,毕竟现成的组件,要比自己用别的方式实现要简单的多。
149 0
鸿蒙开发:使用Circle绘制圆形
|
jenkins 持续交付
Manage Jenkins管理界面提示“依赖错误: 部分插件由于缺少依赖无法加载...“问题解决办法
Manage Jenkins管理界面提示“依赖错误: 部分插件由于缺少依赖无法加载...“问题解决办法
1484 0
Manage Jenkins管理界面提示“依赖错误: 部分插件由于缺少依赖无法加载...“问题解决办法
|
安全 物联网 量子技术
量子密钥分发:保护信息传输安全
【10月更文挑战第1天】量子密钥分发(QKD)利用量子力学原理,如量子叠加和纠缠,实现安全密钥传输。它具有不可克隆性、无条件安全性和实时检测窃听等优势,适用于政府、军事和金融等领域。尽管面临建设成本高和标准化等挑战,但随着技术进步,QKD有望成为信息安全领域的主流技术,为信息传输提供坚实保障。
457 12
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
1093 11
|
JavaScript 前端开发
JavaScript 中 this 的使用方法详解
JavaScript 中 this 的使用方法详解
219 1
|
Ubuntu 测试技术 Linux
warp工具
本文档介绍了在Ubuntu 20.04上使用Cloudflare Warp代理网络以解决访问限制问题。
583 0
|
安全 编译器 C语言
【C++ 类型转换关键字 *_cast 】理解const_cast、reinterpret_cast、dynamic_cast和static_cast的用法
【C++ 类型转换关键字 *_cast 】理解const_cast、reinterpret_cast、dynamic_cast和static_cast的用法
394 0
|
存储 Unix 编译器
C++中虚函数和纯虚函数的问题总结
C++中虚函数和纯虚函数的问题总结
371 0