思路:要么循环到1返回为true;要么进入循环,返回false;
不可能的情况:无穷大,因为四位及以上的数字经过题目中的方法后都会少一位,所以最坏的情况在三位及以内数中循环。
如何考虑循环?
第一种方法,考虑 可以用一个集合来判断是否插入重复元素,用其他数据结构查询时间复杂度太高,不建议使用;
第二种方法,考虑快慢指针,慢指针走一步,快指针走两步,如果最终两者相遇了,那么显然出现循环了。
ps:之前写了个错误代码,因为没看清题意,过了403/404,最后一个"1111111"没过,我以为案例错了,为了100% 通过,补了个案例,最后
后来发现自己的想法有误,即当它是个位时,也需要进行平方操作,于是换了个带循环判断的方法。。。
class Solution {
public:
bool flag=true;
unordered_set<int>s;
int fun(int n)
{
int result = 0;
while (n / 10)
{
int a = n % 10;
result += pow(a, 2);
n = n / 10;
}
int b = n % 10;
result += pow(b, 2);
return result;
}
bool hashfun(int m)
{
if (s.find(m) == s.end())
s.insert(m);
else
flag = false;
return flag;
}
bool isHappy(int n) {
int m =fun(n);
while (flag||m==1)
{
if (m == 1)break;
hashfun(m);
m = fun(m);
}
return flag;
}
};