题干
编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
示例:
输入: 19
输出: true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
想法
这里分享几种方法,边看代码边讲。
一、每次都求现在这个数的每个数位拆开的数的平方和,如果这个平方和存在于我用于存储的list里,那就break。否则将它加入list
你仔细想一想,它原本是不该有循环的,如果有,说明所有的情况都已经遇到过一次了。
这样判断list里有没有1即可,有1就是,否则不是
class Solution {
public boolean isHappy(int n) {
List<Integer> list=new ArrayList<Integer>();
list.add(n);
while(n!=1){
int temp=0;
while(n!=0){//求每个数的平方和
temp+=(n%10)*(n%10);
n=n/10;
}
n=temp;
if(list.contains(n)){//有
break;
}
else{
list.add(n);
}
}
return n==1;}
}
二、前边说了其实最后都是循环,这里发现一个规律,如果是,那么会出现1 ,如果不是那么会出现4
class Solution {
public boolean isHappy(int n) {
int sum = 0;
while (n != 0) {
sum += Math.pow(n % 10, 2);
n /= 10;
if (n != 0) {
continue;
}
if (sum == 1) {
return true;
}
n = sum;
sum = 0;
if (n == 4) {
return false;
}
}
return false;
}
}
三、快慢指针
快慢指针分别求解,最后快慢指针相等了就意味着它不会变了,判断这个是不是为1 即可
class Solution {
public boolean isHappy(int n) {
int slow=sum_happy(n),fast=sum_happy(sum_happy(n));
while(slow!=fast){
slow=sum_happy(slow);
fast=sum_happy(sum_happy(fast));
}
return slow==1;
}
private int sum_happy(int n){
int sum=0;
while(n!=0){
int b=n%10;
sum=sum+b*b;
n=n/10;
}
return sum;
}
}
后两种代码摘自leetcode官方
总结
快慢指针真的很难想到,一定要多加练习