本文正在参加「Java主题月 – Java 刷题打卡」,详情查看 活动链接
一、题目描述
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 true ;不是,则返回 false 。
从简单题目开始刷,锻炼自己的思维能力,为面试准备~
二、思路分析
-
先看懂题干,读懂示例,再带入自己的想法来进行思考和解题:
-
示例 1:
输入:19 输出:true 解释: 12 + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1 复制代码
-
示例2:
输入:n = 2 输出:false 复制代码
-
一目了然,第一思路肯定是将输入的
数字
拆开,然后把每一个平方都加起来,一直循环,一直找到结果1时就代表这个输入的数是快乐数
,反之则不是。 -
继续往下思考,什么样的情况会导致无限循环?答案显而易见,出现同一个数两次,则证明已经陷入了死循环,返回false。
-
有了想法自然是通过代码来实现啦!
三、AC 代码
-
暴力破解法:
class Solution { public boolean isHappy(int n) { int slow=sum_happy(n),fast=sum_happy(sum_happy(n)); //slow为n的每个数字的平方和,fast为slow的每个数字的平方和 while(slow!=fast){ //直到平方和恒为一个数结束循环 slow=sum_happy(slow); fast=sum_happy(sum_happy(fast)); } return slow==1; //如果平方和为1,则是快乐数 } private int sum_happy(int n){ //计算n的每个数字的平方和 int sum=0; while(n!=0){ int b=n%10; //用取余的方法取出每个数字 sum=sum+b*b; n=n/10; //更新n } return sum; } } 复制代码
-
利用set破解:
public boolean isHappy(int n) { //数据集合,Set中不能添加重复的元素,我们要充分的利用这个点来进行判断 Set<Integer> happySet = new HashSet<>(); happySet.add(n); while(n != 1){//当n=1时,证明这个数是快乐数,死循环结束,返回true int sum=0; while(n/10!=0){//求n的平方和 int t=n%10; sum=sum+t*t; n=n/10; } n=sum+n*n;//n为原来的n的每位平方和 if(happySet.contains(n)){//判断set里是否包含和n相同的数,如果有相同的数,证明进入死循环,不是快乐数 return false; } happySet.add(n); } return true; } 复制代码
- 巧妙的运用了Set的特性:不能添加重复元素。其实这个也可以用ArrayList等来进行,在这里选用Set的原因就是其效率较高。
四、总结
- 有个好玩的点这里需要提一下,其实这个快乐数有个
小bug
,非快乐数都会有89出现。不信的话可以多写几组将每次的平方和打印出来哦~ - 写完之后到网上看了一下,有一种写法虽然效率慢,但是看起来很高级,就是【快慢指针】解法,这个思路就留给大家自己去思考学习了。
- 点击跳转:快慢指针
路漫漫其修远兮,吾必将上下求索~
如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END