day6
思路:
主要是想清楚如何判断无限循环?
这里就是如果 sum 出现了两次,就代表开始了循环
是如何发现这个规律的呢?建议还是动手多算一下,就发现了。我第一次写懒了一下,就推不出来无限循环的条件是什么。所以一点思路都没有。
判断一个数是否出现过,这里就自然想到了哈希方法。这里采用set,用set 的原因是数据比较离散。用数组的话,浪费空间。
注意点:
1. 要清楚如何拆分一个数 n % 10 取末尾,n / 10 取商。知道了这些,才知道如何求sum
2.在循环的时候,记得要用 sum 来不断代替 n ,也就是 n = sum。这样才满足题意。n 代表的是下一个拿去求 sum 的数,是不断在变化的
class Solution {
public:
int getSum(int n)
{
int sum = 0;
while(n)
{
sum = sum + (n % 10) * (n % 10); // 这里也犯错误了,没有把 sum 加上
n = n /10;
}
return sum;
}
bool isHappy(int n) {
// 怎样判断无限循环呢? 多写几次,发现平法之和会重复,有规律可循
// 所以接下来重要的就是 计算 平方和,可以单独出一个函数
unordered_set<int> res;
while(1)
{
int sum = getSum(n);
if(sum == 1)
return true;
else
{
if(res.find(sum) != res.end()) // 找到了,就代表无限循环
return false;
else
res.insert(sum);
}
n = sum; // 犯错误的地方,这里没有写 n = sum
}
}
};