目录
1.题目描述
2.分析
此题可能会遇到三种情况:
其实第三种情况可以排除,举个例子就知道了
3.算法
算法分为两部分,我们需要设计和编写代码。
给一个数字 nn,它的下一个数字是什么?
按照一系列的数字来判断我们是否进入了一个循环。
第 1 部分我们按照题目的要求做数位分离,求平方和。
第 2 部分可以使用哈希集合完成。每次生成链中的下一个数字时,我们都会检查它是否已经在哈希集合中。
如果它不在哈希集合中,我们应该添加它。
如果它在哈希集合中,这意味着我们处于一个循环中,因此应该返回 false。
我们使用哈希集合而不是向量、列表或数组的原因是因为我们反复检查其中是否存在某数字。检查数字是否在哈希集合中需要 O(1)O(1) 的时间,而对于其他数据结构,则需要 O(n)O(n) 的时间。选择正确的数据结构是解决这些问题的关键部分
4.代码实现
class Solution {
public:
int getNext(int n) {//数位分离函数
int totalSum = 0;
while (n > 0) {
int d = n % 10;
n = n / 10;
totalSum += d * d;
}
return totalSum;
}
bool isHappy(int n) {
unordered_set<int> set;//定义一个容器
while (1) {
int sum = getNext(n);
if (sum == 1) {
return true;
}
if (set.find(sum) != set.end()) {//判断容器中是否存在,若存在则是无限循环,即需跳出循环
return false;
} else {
set.insert(sum);//插入容器
}
n = sum;
}
}
};
5.知识点
unordered_set 容器,可直译为“无序 set 容器”,即 unordered_set 容器和 set 容器很像,唯一的区别就在于 set 容器会自行对存储的数据进行排序,而 unordered_set 容器不会。
总的来说,unordered_set 容器具有以下几个特性:
- 不再以键值对的形式存储数据,而是直接存储数据的值;
- 容器内部存储的各个元素的值都互不相等,且不能被修改。
- 不会对内部存储的数据进行排序(这和该容器底层采用哈希表结构存储数据有关)