LeetCode算法题-Add Digits(Java实现-3种解法)
这是悦乐书的第199次更新,第207篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第63题(顺位题号是258)。给定非负整数num,重复添加其所有数字,直到结果只有一位数。例如:
输入:38
输出:2
说明:过程如下:3 + 8 = 11,1 + 1 = 2。由于2只有一位数,所以请将其返回。
跟进:你可以在O(1)运行时间内没有任何循环/递归的情况下执行此操作吗?
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
特殊情况:如果num小于10,直接返回num即可。
正常情况:此解法是利用递归,因为每计算一次后得到的结果还是相同的问题。因为题目给定的是正整数,所以可以借助字符串来操作。先将num转为字符串,然后依次获取字符相加,得到每位数的和,然后继续调用自身。
public int addDigits(int num) {
if (num < 10) {
return num;
}
String str = num+"";
int sum = 0;
for (int i=0; i<str.length(); i++) {
sum += str.charAt(i)-'0';
}
return addDigits(sum);
}
03 第二种解法
特殊情况:如果num小于10,直接返回num即可。
正常情况:此解法是利用迭代,使用两层循环,外层判断大小,内层进行数据计算,先对10取余,再除以10,进入下一位接着计算,如果算到最后一位,跳出内层循环,此时还要加上对10取余的余数,因为内层循环只是做判断,然后将算出的和赋值给num,sum归为0,再开始下一次的循环。
public int addDigits2(int num) {
if (num < 10) {
return num;
}
int sum = 0;
while (num >= 10) {
while (num/10 != 0) {
sum += num%10;
num /= 10;
}
sum += num%10;
num = sum;
sum = 0;
}
return num;
}
04 第三种解法
可以先计算一部分数据,找找规律。
9 --> 9 --> 9%9=0 ?
10 --> 1 --> 10%9=1
13 --> 4 --> 13%9=4
18 --> 9 --> 18%9=0 ?
19 --> 1 --> 19%9=1
22 --> 4 --> 22%9=4
25 --> 7 --> 25%9=7
27 --> 9 --> 27%9=0 ?
29 --> 2 --> 29%9=2
33 --> 6 --> 33%9=6
36 --> 9 --> 36%9=0 ?
37 --> 1 --> 37%9=1
39 --> 3 --> 39%9=3
43 --> 7 --> 43%9=7
45 --> 9 --> 45%9=0 ?
46 --> 1 --> 46%9=1
49 --> 4 --> 49%9=4
通过上面这些数的计算,可以发现最后计算出的结果是有周期的,从1到9不断循环,并且除了9的倍数以外的数,其他的数都可以间接通过对9取余得到最后的结果,但是以9为倍数的整数,我们可以曲线救国,将原数减1后再对其取余,然后再把1补上。最后我们得到这样的公式:(num-1)%9 + 1。
public int addDigits3(int num) {
return (num-1)%9 + 1;
}
05 小结
算法专题目前已连续日更超过一个月,算法题文章63+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Add Digits(Java实现-3种解法)的更多相关文章
- LeetCode算法题-Rotated Digits(Java实现)
这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...
- LeetCode算法题-Add Strings(Java实现)
这是悦乐书的第223次更新,第236篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第90题(顺位题号是415).给定两个非负整数num1和num2表示为字符串,返回num ...
- LeetCode算法题-Add Binary(Java实现)
这是悦乐书的第157次更新,第159篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第16题(顺位题号是67).给定两个二进制字符串,返回它们的总和(也是二进制字符串).输 ...
- LeetCode算法题-Heaters(Java实现)
这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...
- LeetCode算法题-Sqrt(Java实现)
这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...
- LeetCode算法题-Subdomain Visit Count(Java实现)
这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...
- LeetCode算法题-Unique Morse Code Words(Java实现)
这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...
- LeetCode算法题-Letter Case Permutation(Java实现)
这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...
- LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)
这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...
随机推荐
- Git介绍及常用操作演示(一)--技术流ken
Git介绍 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发 ...
- MySQL系列详解二:MySQL语句操作-技术流ken
简介 本篇博客将详细讲解mysql的一些常用sql语句操作,例如创建数据库,删除数据库,创建表,修改表,删除表,以及简单查询案例. 关于mysql数据中的SQL的大小写问题 1.不区分大小写 1. s ...
- Scrapy爬虫(5)爬取当当网图书畅销榜
本次将会使用Scrapy来爬取当当网的图书畅销榜,其网页截图如下: 我们的爬虫将会把每本书的排名,书名,作者,出版社,价格以及评论数爬取出来,并保存为csv格式的文件.项目的具体创建就不再多讲 ...
- 使用.Net Core 2.1开发Captcha图片验证码服务
更新后续篇:Captcha服务(后续1) 使用.Net Core 2.1开发Captcha验证码服务 开发工具:Visual Studio 2017 15.7.3 开发平台:64位 Windows 1 ...
- MVC 视图助手书写规范及注意点
@Html.TextBoxFor() 讲解(其他类似的 @Html.LabelFor 等)同理 @Html.TextBoxFor(model => model.SearchParams.Name ...
- log4.net 自定义日志文件名称
插件化项目中,遇到这样一个需求,每个插件 或者每个方法 一个日志文件,方便后期错误排查 源码地址: https://github.com/xlb378917466/SharpHttpServerCas ...
- .NET 中的序列化 & 反序列化
序列化:将对象的状态信息及类型信息,转换为一种易于传输或存储形式(流,即字节序列)的过程. 下图为序列化过程图示,图片来自微软官方文档: 反序列化:与序列化相反,将流转换为对象的过程. 常用的有二进制 ...
- T-SQL基础(六)之可编程对象
变量 -- 声明变量 DECLARE @variable_name [AS] variable_type; -- 变量赋值 SET @variable_name = variable_value; 示 ...
- Mybatis框架基础支持层——解析器模块(2)
解析器模块,核心类XPathParser /** * 封装了用于xml解析的类XPath.Document和EntityResolver */ public class XPathParser { / ...
- HashMap深度解析
最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap也一样.当程序试图将多个 key-value 放入 HashMap 中时,以如下代码片 ...