(写给未来遗忘的自己)
class Solution {
public:
bool isHappy(int n) {
std::unordered_set<int> sum_set;
while(true){
int sum=add_sum(n);
if(sum_set.find(sum)!=sum_set.end()){
return false;
}
if(sum==1){
return true;
}else{sum_set.insert(sum);}
n=sum;
}
}
int add_sum(int n){
int sum=0;
int n_n=n;
while(n_n){
sum+=(n_n%10)*(n_n%10);
n_n=n_n/10;
}
return sum;
}
};
做题的思维:
1. 思考如何会出现,如何永远不出现?
位置上的数平方后的和,如果和出现了相等的情况,那么就意味着陷入了死循环,永远求解不到解,所以只要不进入死循环就让他一直求解下去。
2. 怎么快速查是否相等的和存在?
利用 unordered_set的哈希数表。查找的速度为log(n)。
if(sum_set.find(sum)!=sum_set.end()){
return false;
}
//从头遍历一遍,不等于尾部就说明找到了
3. 怎么可以做到求解位数的平方呢?
一个整数对10取余就得到最后一位数,然后整数对10取商就剔除最后一位,倒数第二位成为最后一位,一直循环,直到取商为0;