您的位置:首页 > 编程语言 > Java开发

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

2019-03-12 19:03 232 查看

题目描述:

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

一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 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
 来记录之前出现的数字。

        代码如下:

[code]   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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: