1. 程式人生 > 實用技巧 >LeetCode202-快樂數

LeetCode202-快樂數

非商業,不侵權,LeetCode連結附上:

https://leetcode-cn.com/problems/happy-number/

進入正題。

題目:

編寫一個演算法來判斷一個數 n 是不是快樂數。

「快樂數」定義為:對於一個正整數,每一次將該數替換為它每個位置上的數字的平方和,然後重複這個過程直到這個數變為 1,也可能是 無限迴圈 但始終變不到 1。如果 可以變為 1,那麼這個數就是快樂數。

如果 n 是快樂數就返回 True ;不是,則返回 False 。

示例:

輸入:19
輸出:true
解釋:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

程式碼實現:

    /**
     * 獲取當前數的平方和,即下一個數
     */
    private static int getNext(int n) {

        int temp = 0;
        while (n > 0) {
            temp += Math.pow(n % 10, 2);
            n = n / 10;
        }
        return temp;
    }


    /**
     * 兩種情況
     * 1.n是一個快樂數,此時沒有迴圈,快跑者比慢跑著先到達數字1
     * 2.n不是一個快樂數,最終快跑者和慢跑者將在同一個數字上相遇
     * @param n
     * @return
     */
    private static 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;
    }
    //時間複雜度O(logN), 空間複雜度O(1)

    

 

分析:

定義一個單獨方法,根據規則,用來確定當前數的下一個數;

快慢指標用於快速的判斷是否為快樂數,或非快樂數時,在迴圈的某個數字上相遇。