今天你快乐吗?一起来刷快乐数吧!|Java 刷题打卡

956 阅读3分钟

本文正在参加「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;
        }
    }
    
    • image-20210526170146710.png
  • 利用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;
        }
    
    • image-20210526170227917.png
    • 巧妙的运用了Set的特性:不能添加重复元素。其实这个也可以用ArrayList等来进行,在这里选用Set的原因就是其效率较高。

四、总结

  • 有个好玩的点这里需要提一下,其实这个快乐数有个小bug,非快乐数都会有89出现。不信的话可以多写几组将每次的平方和打印出来哦~
  • 写完之后到网上看了一下,有一种写法虽然效率慢,但是看起来很高级,就是【快慢指针】解法,这个思路就留给大家自己去思考学习了。
  • 点击跳转:快慢指针

路漫漫其修远兮,吾必将上下求索~ 如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah