本文主要讲解记录快乐数中的要点和细节
具体c++与java代码如下,末尾
编写一个算法来判断一个数
n
是不是快乐数。「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果
n
是 快乐数 就返回true
;不是,则返回false
。
具体要点:
1.通过审题,我们可以发现快乐数的两个核心判定方法:
- 每个位置的平方和==1,即快乐数,返回true
- 每个位置的平方出现无限循环的特征,出现过之前的数。即不是快乐数,返回false
2.根据我们1的分析,不论哪个判定方法,我们都需要先计算:每个位置的平方和 sum。
3.让我们分析怎么实现1中的判定方法:
第一种判定方法比较好实现,直接if判断是否等于1即可
第二种判定方法,我们需要知道:这个数是不是之前出现过的数。对于这类特性,我们要想到使用哈希表的方法来解决(可以拿这个题练习,核心思想一样),并且这道题只需要知道有没有出现过,不用知道数量等结果,我们可以选择unordered_set的方法来解决
对于新结果:判断有没有出现过,若出现过——直接返回false 若没有出现过——把他加入哈希表
c++代码如下:
#include<unordered_set>
using namespace std;
class Solution {
public:
//获取吗,每一位的值,平方求和
int getSum(int n) {
int result=0;
while (n) {
result += (n % 10) * (n % 10);
n /= 10;
}
return result;
}
bool isHappy(int n) {
//定义一个哈希表
unordered_set<int> hashset;
int sum = 0;
//设置死循环,终止条件只有两个,1.快乐数-返回true 2.找到无限循环-返回false
while (1) {
sum = getSum(n);
//sum==1快乐数
if (sum == 1)return true;
//发现是之前存过的数
if (hashset.find(sum) != hashset.end())return false;
//既不是快乐数,也没有存过,这里可以省略else,因为之前都有return
hashset.insert(sum);
//更新n,方便下一次循环
n = sum;
}
}
};
java代码如下:
class Solution {
public int getSum(int n) {
int sum = 0;
while (n > 0) {
sum += (n % 10) * (n % 10);
n = n / 10;
}
return sum;
}
public boolean isHappy(int n) {
Set<Integer> hashset = new HashSet<>();
int sum = 0;
while (true) {
sum = getSum(n);
if (sum == 1) return true;
if (hashset.contains(sum)) return false;
hashset.add(sum);
n=sum;
}
}
}