
方法一:快慢指针
根据题意,重复的过程只有两种情况,一种是出现1,则为快乐数,另一种是无限循环,则不是快乐数,那么问题就变成了寻找其是否出现循环,寻找是否出现循环的题第一个就想到了快慢指针,如果出现循环,那么快指针必定会追上慢指针,当两者重合时即可判断其出现循环。
- 代码实现:
class Solution {
public boolean isHappy(int n) {
int slow = n;
int fast = n;
do{
slow = getNext(slow);
fast = getNext(getNext(fast));
if(slow == 1 || fast == 1){
return true;
}
}while(slow != fast);
return false;
}
public int getNext(int n){
int sum = 0;
do{
sum = sum + (n % 10) * (n % 10);
n = n/10;
}while(n != 0);
return sum;
}
}
方法二:HashSet表
利用HashSet的contains方法可以找出当前数是否重复,如果不重复则加入HashSet表,重复的话就表示出现循环,返回false,Hash表对于大量数据才能发挥出其优秀的性能,所以对于少量数据还是使用快慢指针好一点。
- 代码实现:
class Solution {
public boolean isHappy(int n) {
HashSet<Integer> arr = new HashSet<>();
while(!arr.contains(n)){
arr.add(n);
if(n == 1){
return true;
}
n = getNext(n);
}
return false;
}
public int getNext(int n){
int sum = 0;
do{
sum = sum + (n % 10) * (n % 10);
n = n/10;
}while(n != 0);
return sum;
}
}
网友评论