版本更新
This commit is contained in:
@@ -1,71 +0,0 @@
|
||||
# 题目地址
|
||||
https://leetcode-cn.com/problems/happy-number/
|
||||
|
||||
> 该用set的时候,还是得用set
|
||||
|
||||
# 第202题. 快乐数
|
||||
|
||||
编写一个算法来判断一个数 n 是不是快乐数。
|
||||
|
||||
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
|
||||
|
||||
如果 n 是快乐数就返回 True ;不是,则返回 False 。
|
||||
|
||||
**示例:**
|
||||
|
||||
输入:19
|
||||
输出:true
|
||||
解释:
|
||||
1^2 + 9^2 = 82
|
||||
8^2 + 2^2 = 68
|
||||
6^2 + 8^2 = 100
|
||||
1^2 + 0^2 + 0^2 = 1
|
||||
|
||||
# 思路
|
||||
|
||||
这道题目看上去貌似一道数学问题,其实并不是!
|
||||
|
||||
题目中说了会 **无限循环**,那么也就是说**求和的过程中,sum会重复出现,这对解题很重要!**
|
||||
|
||||
正如:[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/g8N6WmoQmsCUw3_BaWxHZA)中所说,**当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。**
|
||||
|
||||
所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。
|
||||
|
||||
判断sum是否重复出现就可以使用unordered_set。
|
||||
|
||||
**还有一个难点就是求和的过程,如果对取数值各个位上的单数操作不熟悉的话,做这道题也会比较艰难。**
|
||||
|
||||
# C++代码
|
||||
|
||||
```
|
||||
class Solution {
|
||||
public:
|
||||
// 取数值各个位上的单数之和
|
||||
int getSum(int n) {
|
||||
int sum = 0;
|
||||
while (n) {
|
||||
sum += (n % 10) * (n % 10);
|
||||
n /= 10;
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
bool isHappy(int n) {
|
||||
unordered_set<int> set;
|
||||
while(1) {
|
||||
int sum = getSum(n);
|
||||
if (sum == 1) {
|
||||
return true;
|
||||
}
|
||||
// 如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return false
|
||||
if (set.find(sum) != set.end()) {
|
||||
return false;
|
||||
} else {
|
||||
set.insert(sum);
|
||||
}
|
||||
n = sum;
|
||||
}
|
||||
}
|
||||
};
|
||||
```
|
||||
> 更多算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。
|
||||
|
||||
Reference in New Issue
Block a user