Leetcode题库 - 快乐数(java语言版)

题目描述:

编写一个算法来判断一个数是不是“快乐数”。

一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。

示例: 

输入: 19
输出: true
解释: 
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

       本题扎看一眼还真有点懵,这个快乐数最后通过一个数的不断平方加和最后变成1,但什么时候才不是快乐数呢,题目中说了,无限循环时不是快乐数。那这样这个题就简单了,用set存储每一次的平方的和,然后执行循环判断set中有没有存储过的数,有的话就证明重复,也就是陷入了无限循环中。看了一下别人的思路,看到好多投机的方法,比如,n=4的时候肯定不是快乐数,n=1或7时一定是快乐数。然后进行判断,时间复杂度比用set要低,不过的好好算算快乐数的规则,才能得出这些结论,还是推荐用set.

        具体思路:判断出现的数之前有没有出现过,出现过就会产生循环,就不是快乐数。可以用集合 set 来记录之前出现的数字。

        代码如下:

   int n = 19;
       int sum=0;//记录每次平方的和,注意,每执行完一次,就必须使,sum归0,因为平方后的n是一个新的数,必须用新的sum接受(相加)。
       Set<Integer> set = new HashSet <> ();//用来记录已经存在的数,如果再次出现证明重复了,这样的话就陷入了循环就不是快乐数了。
       while (n!=1){
//           执行一次平方的和
            while (n>0) {
                sum=(int) (sum + Math.pow ( (n % 10) , 2 ));//n%10相当于取末尾的数字(19---9)
                n=n / 10;//相当于取前面的数字(19-----1)
            }
//            将执行完的和赋值给n,为下一次执行做准备
            n = sum;
//            重点是这个地方得给sum赋值0,让sum变成'新的'用于下一次的平方累加
            sum=0;
//            用到集合的contains判断集合中是否有这个数字,有的话证明重复了,重复了就是这个进入循环了,就不是快乐数了
            if (set.contains (n )){
                System.out.println("不是快乐数");
            }else {
                set.add ( n );
            }
       }
       //当循环执行完毕时,这时的n就为1了所以返回true
        System.out.println("是快乐数");

执行结果:

执行用时:

    总结:这道题用到了set相关的方法,这道题很有意思,也很有挑战性。

2019-3-12

发布了43 篇原创文章 · 获赞 6 · 访问量 6668

猜你喜欢

转载自blog.csdn.net/weixin_37850160/article/details/88426611