#202. 快乐数
难度:简单 2020/4/30每日一题打卡
四月份的每日一题打卡就这样结束了,呜呜还有点舍不得。第一次坚持了一个月,以后也要继续加油啊!
题目描述
解题思路
快乐暴力法
这个题其实也不难,关键在于死循环的判断,看了评论之后发现如果进入死循环,会有固定的套路-----------------不是快乐数的数称为不快乐数(unhappy number),所有不快乐数的数位平方和计算,最後都会进入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循环中。
所以只要循环中出现这里面任何一个数字,代表进入了死循环,结束循环就完事了。
public boolean isHappy(int n) {
int temp = 0;
while(n != 0){
temp += (n%10)*(n%10);
n = n/10;
if(n == 0){
if(temp == 1) return true;
if(temp == 4) return false;
n = temp;temp = 0;
}
}
return false;
}
高级快慢指针法
看评论的时候还学习到了一种快慢指针思想:大概是一个快指针,一个慢指针,两个总会相遇,要么结束循环相遇,要么中间相遇。
//参考英文网站热评第一。这题可以用快慢指针的思想去做,有点类似于检测是否为环形链表那道题
//如果给定的数字最后会一直循环重复,那么快的指针(值)一定会追上慢的指针(值),也就是
//两者一定会相等。如果没有循环重复,那么最后快慢指针也会相等,且都等于1。
class Solution {
public boolean isHappy(int n) {
int fast=n;
int slow=n;
do{
slow=squareSum(slow);
fast=squareSum(fast);
fast=squareSum(fast);
}while(slow!=fast);
if(fast==1)
return true;
else return false;
}
private int squareSum(int m){
int squaresum=0;
while(m!=0){
squaresum+=(m%10)*(m%10);
m/=10;
}
return squaresum;
}
}