题目:
编写一个算法来判断一个数 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
提示:
1 <= n <= - 1
思路:
查重,快慢指针或者哈希表都可以。快慢指针原理已在链表中应用过,所以这里选择哈希表方法解决问题。其实数据也是有限制的,使用数组也可以充当哈希表解决问题,这样能大大节省时间。
但为了练习这里使用unordered_set。
首先写个函数,获得各位的平方和。
然后不断循环更新平方和,不在哈希表里则插入到哈希表里,在哈希表里则返回false,如果平方和等于1则返回true。
解题过程:
创建各位平方和计算函数。
int happynum(int num){
int sum = 0;
while(num){
sum += (num % 10) * (num % 10);
num /= 10;
}
return sum;
}
创建哈希表。
unordered_set<int> set;
创建循环体,当平方和不为1时继续循环。
如果平方和不在哈希表中,则插入哈希表中。在哈希表中则返回false。
然后更新快乐数。
while(happynum(n) != 1){
int happy = happynum(n);
if(set.find(happy) != set.end()){
return false;
}else{
set.insert(happy);
}
n = happy;
}
题解:
class Solution {
public:
int happynum(int num){
int sum = 0;
while(num){
sum += (num % 10) * (num % 10);
num /= 10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> set;
while(happynum(n) != 1){
int happy = happynum(n);
if(set.find(happy) != set.end()){
return false;
}else{
set.insert(happy);
}
n = happy;
}
return true;
}
};