LeetCode算法题-Happy Number(Java实现)
这是悦乐书的第188次更新,第190篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第47题(顺位题号是202)。编写算法以确定数字是否“幸福”。
幸福数字是由以下过程定义的数字:从任何正整数开始,将数字替换为其数字的平方和,并重复该过程,直到最后数字等于1。这个过程以1结尾的那些数字是幸福的数字。如果陷入无限循环则不是幸福数字。例如:
输入:19
输出:true
说明:
1x1 + 9x9 = 82
8x8 + 2x2 = 68
6x6 + 8x8 = 100
1x1 + 0x0 + 0x0 = 1
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
从题目给的例子可以看出,每获得一个新的数字,都需要按照个十百位拆分然后计算乘积,直到最后得到的是1为止,而那些不是幸福数字的数,会陷入死循环里面,因此,我们需要将每次新计算得到的结果保存起来,如果下次计算的时候遇到,可以直接判断该数字不是幸福数字,因此我们使用HashMap来存值,使用递归来循环处理数据。因为需要多次使用Map,所以将其定义在方法外面,可以全局使用。
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
public boolean isHappy(int n) {
if (n <= 0) {
return false;
}
if (n == 1) {
return true;
}
int index = 1;
int sum = 0;
for (int i=0; i <(n+"").length(); i++) {
sum += Math.pow((n+"").charAt(i)-'0', 2);
}
if (sum == 1) {
return true;
}
if (map.containsKey(sum)) {
return false;
} else {
map.put(sum, index++);
}
return isHappy(sum);
}
03 第二种解法
思路与上面一样,不过使用的是迭代的方法,所以,定义的HashMap放在你方法里面。使用了两层循环,外层控制map判断key是否存在以及替换新的n,内层循环处理新数不同位整数的平方和。
public boolean isHappy2(int n) {
if (n <= 0) {
return false;
}
if (n == 1) {
return true;
}
Map<Integer, Integer> map2 = new HashMap<Integer, Integer>();
int index = 1;
int sum = 0;
while (true) {
for (int i=0; i <(n+"").length(); i++) {
sum += Math.pow((n+"").charAt(i)-'0', 2);
}
if (sum == 1) {
return true;
}
if (map2.containsKey(sum)) {
return false;
} else {
map2.put(sum, index++);
}
n = sum;
sum = 0;
}
}
04 第三种解法
如果你算过几个特殊的数,比如2、4、14、16、18,这些数字都会陷入死循环,并且是数字4.至于其他的数,如果不是幸福数,都会陷入死循环里面,死循环的入口就是4或者16,对此,我们可以不使用HashMap,只要判断新得到的数是否等于4或者16即可表示此数字不是幸福数字。
此解法同样是使用迭代的方法,借助两层循环,外层做判断,内层做不同位数字的平方和。
public boolean isHappy3(int n) {
int sum = 0;
while (sum != 1) {
if (n == 4 || n == 16)
break;
while (n > 0) {
int rem = n % 10;
sum += rem * rem;
n /= 10;
}
if (sum == 1)
return true;
n = sum;
sum = 0;
}
return false;
}
05 第四种解法
使用HashSet,借助其不能存在重复元素的特性,思路和第一、第二种解法一样,都是先去获取新数的平方和,然后添加进HashSet,如果添加失败,说明已经存在该整数,即不是幸福数。不过这里是改变了n的原始值,所以最后判断的是n是否等于1。
public boolean isHappy4(int n) {
HashSet<Integer> seen = new HashSet<>();
while (seen.add(n)) {
int square = 0;
int sum = 0;
while (n!=0) {
square = n%10;
sum += (square*square);
n /=10;
}
n = sum;
}
return n==1 ? true : false;
}
06 第五种解法
借助环的思路。如果你还对之前的判断一个链表是否存在环的那道题目有印象的话,那么此题是与之类似的,每次新得到的数就代表一个节点,如果此节点出现过一次,即表示此链表是有环的,也就是说明此数是幸福数。
借助双指针,一个每次进行一次计算,另外一个每次计算两次,相当于速度是前一个的两倍,如果存在相同的数,两个指针肯定会相遇。
public boolean isHappy5(int n) {
int slow = n;
int fast = n;
do {
slow = digitSquareSum(slow);
fast = digitSquareSum(fast);
fast = digitSquareSum(fast);
if (slow == 1 || fast == 1) {
return true;
}
} while(slow != fast);
return false;
}
public int digitSquareSum(int n) {
int sum = 0, tmp;
while (n > 0) {
tmp = n % 10;
sum += tmp * tmp;
n /= 10;
}
return sum;
}
07 小结
算法专题目前已连续日更超过一个月,算法题文章47+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Happy Number(Java实现)的更多相关文章
- LeetCode算法题-Perfect Number(Java实现)
这是悦乐书的第249次更新,第262篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第116题(顺位题号是507).我们定义Perfect Number是一个正整数,它等于 ...
- LeetCode算法题-Prime Number of Set Bits in Binary Representation(Java实现)
这是悦乐书的第311次更新,第332篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第180题(顺位题号是762).给定两个正整数L和R,在[L,R]范围内,计算每个整数的 ...
- LeetCode算法题-Largest Number At Least Twice of Others(Java实现)
这是悦乐书的第308次更新,第328篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第177题(顺位题号是747).在给定的整数数组中,总有一个最大的元素.查找数组中的最大 ...
- LeetCode算法题-Binary Number with Alternating Bits(Java实现)
这是悦乐书的第292次更新,第310篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第160题(顺位题号是693).给定正整数,检查它是否具有交替位:即它的二进制数的任意两 ...
- LeetCode算法题-Fibonacci Number(Java实现)
这是悦乐书的第250次更新,第263篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第117题(顺位题号是509).Fibonacci数字,通常表示为F(n),形成一个称为 ...
- LeetCode算法题-Guess Number Higher or Lower(Java实现)
这是悦乐书的第211次更新,第224篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第79题(顺位题号是374).我们正在玩数字游戏. 游戏如下:我从1到n中选择一个数字. ...
- LeetCode算法题-Missing Number(Java实现-四种解法)
这是悦乐书的第200次更新,第209篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第65题(顺位题号是268).给定一个包含n个不同数字的数组,取自0,1,2,...,n ...
- LeetCode算法题-Ugly Number(Java实现-四种解法)
这是悦乐书的第199次更新,第208篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第64题(顺位题号是263).编写一个程序来检查给定的数字是否是一个丑陋的数字.丑陋的数 ...
- LeetCode算法题-Single Number(Java实现)
这是悦乐书的第175次更新,第177篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第34题(顺位题号是136).给定一个非空的整数数组,除了一个元素外,每个元素都会出现两 ...
随机推荐
- 分布式系统监视zabbix讲解五之web监控--技术流ken
Web 监控 概况 你可以使用 Zabbix 检查几个网站可用性方面. 如果要使用 Web 检测功能,必须在 编译Zabbix 的时候加入 cURL(libcurl) 的支持. 要使用 Web 监控, ...
- EF 传递的主键值的数量必须与实体上定义的主键值的数量匹配 原因
主要是该数据表没有定义主键造成的
- 史上最全python面试题详解(一)(附带详细答案(关注、持续更新))
python基础题(53道题详解) 1.简述解释型和编译型编程语言? 概念: 编译型语言:把做好的源程序全部编译成二进制代码的可运行程序.然后,可直接运行这个程序. 解释型语言:把做好的源程序翻译一句 ...
- 汇编语言--微机CPU的指令系统(五)(移位操作指令)
(5) 移位操作指令 移位操作指令是一组经常使用的指令,它包括算术移位.逻辑移位.双精度移位.循环移位和带进位的循环移位等五大类. 移位指令都有指定移动二进制位数的操作数,该操作数可以是立即数或CL的 ...
- Fundebug能够捕获这些BUG
摘要:Fundebug的JavaScript监控插件更新至0.1.0,可以监控3种不同类型的前端BUG:JavaScript执行错误.资源加载错误.HTTP请求错误. 从简单的onerror开始,Fu ...
- hash 和pushState,replaceState
hash 要点: 1.不会向后台发请求:#是用来指导浏览器动作的,对服务器端完全无用. 2.用来跳转到页面的指定位置: 为网页位置指定标识符,有两个方法.一是使用锚点,比如<a name=& ...
- 浅谈css中的盒模型(框模型)
css中的盒模型是css的基础,盒模型的理解可以帮助我们进行对样式进行修改.废话不多说,进入正题: 在w3c中,CSS 框模型 (Box Model) 规定了元素框处理元素内容.内边框.边框 和 外边 ...
- Vue+axios统一接口管理
通过axios请求接口已经很简单了,但最近在做一个vue项目,想着把axios请求再封装一下,这样api就可以只在一处配置成方法,在使用的时候直接调用这个方法. 但咱们不用每个接口都定义成一个啰嗦的a ...
- 2018-12-09 疑似bug_中文代码示例之Programming in Scala笔记第九十章
续前文: 中文代码示例之Programming in Scala笔记第七八章 源文档库: program-in-chinese/Programming_in_Scala_study_notes_zh ...
- Android为TV端助力 handler ,message消息发送方式
1.Message msg = Message.obtain(mainHandler) msg.obj=obj;//添加你需要附加上去的内容 msg.what = what;//what消息处理的类 ...