算法思想:
- 定义取n的各位数字的函数position和求各位数字平方和的函数multiple;
- 用一个集合uomap来帮助判断while循环过程中有没有环的出现,如果有的话证明会是无限循环且一定不是快乐数,所以循环会停止,并return false;
- 如果暂时没发现循环,则搜索是否出现各位数字平方和为1的答案,若搜索到了则return true,或出现环了则return false。
C++
class Solution {
public:
vector<int> position(int n){
vector<int> res;
while(n != 0){
int p = n % 10;
res.push_back(p);
n = n / 10;
}
return res;
}
int multiple(vector<int>& arr){
int sum = 0;
for(auto v : arr){
sum += v * v;
}
return sum;
}
bool isHappy(int n) {
int res = 0;
int tmp = n;
unordered_set<int> uoset;
while(1){
vector<int> temp = position(tmp);
res = multiple(temp);
if(res == 1) break;
else if(uoset.find(res) == uoset.end()){
uoset.insert(res);
}else{
return false;
}
tmp = res;
}
return true;
}
};