一、前言
今天的题目不是很难,解题的核心我想应该是分为两个步骤,一个是对数字的处理,另一个是对sum的存储。因此今天的解题按照这两个步骤来做,应该是比较简单、明了。接下来就直接上题目吧。
二、题目(力扣第202题—快乐数. - 力扣(LeetCode))
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
示例 1:
输入:n = 19 输出:true 解释:
示例 2:
输入:n = 2 输出:false
三、题解
我先把卡哥的讲解放出来(代码随想录),卡哥的讲解很清楚。我的思路和卡哥是一致的,然后有些处理(代码的编写)向卡哥学到了很多,感谢卡哥(yyds)。
我先把代码放出来:
int getsum(int n){
int sum=0;
while(n){
sum+=(n % 10) * (n % 10);
n =n/10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int>unst;
while(1){
int sum=getsum(n);
if(sum==1)return true;
if(unst.find(sum)!=unst.end()){
return false;
break;
}
else{
unst.insert(sum);
}
n=sum;
}
}
可以从上面的代码看出来,是分成了两个函数,一个是用来处理n,来得到n的每一位的平方和;
另一个是判断是否是快乐数,同时将不同的快乐数存入set中。下面来详细讲讲每个函数(请uu们自己看注释)。
(1)平方和函数:
int getsum(int n){//返回每一位的平方和
int sum=0;
while(n){
sum+=(n % 10) * (n % 10);//n每次取个位的数字,平方和加到sum上
n =n/10;//n每次右移一位(相当于缩小10倍)
}
return sum;
}
(2)判断函数(主函数)
bool isHappy(int n) {
unordered_set<int>unst;//使用unordered_set
while(1){//循环一直存在,除非循环内部出现break
int sum=getsum(n);//得到n的每个平方和
if(sum==1)return true;
if(unst.find(sum)!=unst.end()){//如果sum已经在set中出现,则说明已经陷入死循环
return false;
break;
}
else{
unst.insert(sum);//如果sum没有在set中出现,则存入set中
}
n=sum;//用上一次的sum替换n
}
}
四、后记
在这里说一句,这里使用set而不用vector,主要是因为set可以使用find函数,而vector则没有find函数,这里使用find函数可以非常简单的判断元素是否在set中。题目是不难的,需要一步一步的分析和拆解,如何处理好每一位的平方和都是需要思考的。加油坚持坚持,我们都有光明的未来!!!