判斷一個數(shù)n是不是快樂數(shù)

快樂數(shù)」定義為:對于一個正整數(shù),每一次將該數(shù)替換為它每個位置上的數(shù)字的平方和,然后重復這個過程直到這個數(shù)變?yōu)?1,也可能是 無限循環(huán) 但始終變不到 1。如果 可以變?yōu)? 1,那么這個數(shù)就是快樂數(shù)。
示例:
輸入:19
輸出:true
解釋:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
算法分析:

  1. 利用hashset
    (1) 數(shù)字分離,求得數(shù)的平方和
    while (n>0){
    i=n%10;
    n=n/10;
    sum+=i*i;
    }
    (2)判斷新得到的n是否存在于hashSet中,如果沒有,繼續(xù)向下進行,如果有,說明進入循環(huán),n不是快樂數(shù)。
    具體實現(xiàn)過程如下:
  public boolean isHappy(int n) {
        int sum=0;
        int i;
        Set <Integer> set=new HashSet<>();
        while (n!=1&&!set.contains(n)){
            sum=0;
            set.add(n);
            while (n>0){
                i=n%10;
                n=n/10;
                sum+=i*i;
            }
            n=sum;
        }
        return n==1;
    }
  1. 快慢指針
    快慢指針可以判斷出一個鏈表中是否有環(huán)存在,運用此題中,如果n進入循環(huán),那么快指針和慢指針總會指向同一個數(shù)。
 //利用快慢指針
    public int getNext(int n){
        int sum=0,i;
        while (n>0){
            i=n%10;
            sum+=i*i;
            n=n/10;
        }
        return sum;
    }
    public boolean isHappy(int n){
        int slow=n;
        int fast=getNext(n);
        while (fast!=1&&slow!=fast){
            slow=getNext(slow);
            fast=getNext(getNext(fast));
        }
        return fast==1;
    }

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/happy-number

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容