题目:
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
示例 1:
输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
示例 2:
输入:n = 2
输出:false
题目解析:
把n的各个位的数提取出来,然后把每个位置变为它的平方,这种方法比较暴力。
class Solution {
public boolean isHappy(int n) {
int sum = 0;
for(int i=0;i<100;i++){
while(n>0){
sum += (n%10)*(n%10);
n = n/10;
}
}
if(sum ==1){
return true;
}
return false;
}
}
最后还没有通过,我也不知道为啥。(如果看到这篇文章的大佬知道的话可以私信我一下不,栓q啦)
之后我看官方详解,用的是哈希表,写得相当详细。
class Solution {
private int getsum(int n){
int sum = 0;
for(int i=0;i<100;i++){
while(n>0){
sum += (n%10)*(n%10);
n = n/10;
}
}
return sum;
}
public boolean isHappy(int n) {
Set<Integer> seen = new HashSet<>();
while (n != 1 && !seen.contains(n)) {
seen.add(n);
n = getsum(n);
}
if(n == 1){
return true;
}
return false;
}
}
后边哈希表里的代码,就是如果下一个生成的数原来没有出现过,就添加到哈希表中;反之,则会一直陷入循环不可能得到1。
心得:
1.sum += (n%10)*(n%10); n = n/10;取各个位置上的数,这两行代码要记住
2.这个题的重点就是要抓住sum循环这个点。这个算法也可以推及到那种某个数是否重复出现等题目上