目录
这题真的是很有意思!先看题目:
可以看出关键是判断是否有死循环的出现!
怎么判断呢,有很多中投机取巧的方法,先看两个:
瞎暴力1:找出死循环数的规律
所有不快乐数的数位平方和计算,最後都会进入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循环中。
class Solution {
public:
bool isHappy(int n) {
int ans,temp;
while(true){
vector<int> v;
ans=0;
while(n!=0){
temp = n%10;
ans+=temp*temp;
n/=10;
}
if(ans == 1)
return true;
else if(ans==4)//遇到4肯定死循环!
return false;
n = ans;
}
return false;
}
};
瞎暴力2:遇到超过100次以上循环还没找到认为是死循环
这种做法面试肯定挂哈哈,不过快乐数快乐就完事了
class Solution {
public:
bool isHappy(int n) {
int ans=0;
for(int i = 0 ; i< 100;i++)
{
while(n>0)
{
ans += (n%10)*(n%10);
n = n /10;
}
n = ans;
if(n==1)
return true;
}
return false;
}
};
快慢指针法:
有点类似于检测是否为环形链表那道题,如果给定的数字最后会一直循环重复,那么快的指针(值)一定会追上慢的指针(值),也就是两者一定会相等。如果没有循环重复,那么最后快慢指针也会相等,且都等于1。
class Solution {
public:
int squareSum(int n){//
int ans = 0,temp;
while(n!=0){
temp = n%10;
ans+=temp*temp;
n/=10;
}
return ans;
}
bool isHappy(int n) {
// 利用快慢指针思想, 慢指针每次做一次转换, 快指针每次做两次转换
// 如果出现无限循环, 那么快慢指针一定相遇
int slow = squareSum(n),fast = squareSum(squareSum(n));
while(slow!=fast){
slow = squareSum(slow);
fast = squareSum(squareSum(fast));
}
return slow==1;
}
};