美文网首页LeetCode每日一题
LeetCode每日一题: 快乐数

LeetCode每日一题: 快乐数

作者: Patarw | 来源:发表于2020-08-11 08:45 被阅读0次

方法一:快慢指针

根据题意,重复的过程只有两种情况,一种是出现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;
}
}

相关文章

网友评论

    本文标题:LeetCode每日一题: 快乐数

    本文链接:https://www.haomeiwen.com/subject/jekedktx.html