1. 程式人生 > 其它 >ASP.NET CORE 依賴注入服務生命週期

ASP.NET CORE 依賴注入服務生命週期

技術標籤:LeetCode演算法javaleetcode

一、需求

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

「快樂數」定義為:

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

示例 1:

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

示例 2:

輸入:n = 2
輸出:false

提示:

1 <= n <= 231 - 1

二、雜湊表

2.1 思路分析

  1. 需要嘗試找到規律,①最終得到1;②隨便找個迴圈後不為1的數,發現該數在迴圈過程中會進入無限的迴圈,比如2->4->16->37->......->37->......,從37開始就開始在這個圈裡;③該數會越來越大,這裡也需要歸納,我們取每一位的最大數,求其平方和,比如9,99,999,......,會發現不管給定的n有多大,它的平方和一定會降低到243以內,那麼情況③就被排除了;
  2. 使用雜湊表儲存每一個n,如果遇到了重複的資料,說明進入了無限迴圈,需要返回false,反之若n變為1,則返回true;

2.2 程式碼實現

class Solution {
    public boolean isHappy(int n) {
        HashSet<Integer> hs = new HashSet<>();
        while(n != 1 && !hs.contains(n)) {
            hs.add(n);
            n = getNext(n);
        }
        return n == 1;
    }
    public int getNext(int n) {
        int sum = 0;
        while(n != 0) {
            int tmp = n % 10;
            sum += tmp * tmp;
            n = n / 10;
        }
        return sum;
    }
}

2.3 複雜度分析

  • 時間複雜度為O(logN)
  • 空間複雜度為O(logN)

三、快慢指標

3.1 思路分析

  1. 根據上一種方法的分析,有兩種情況①n迴圈後最終得到1;②n迴圈會產生一個環;
  2. 這個環可以看作一個虛擬的連結串列,那麼情況②就轉換為判斷連結串列是否有一個環,故利用弗洛伊德迴圈查詢演算法,定義快指標和慢指標,快指標每次移動兩步,慢指標每次移動一步,如果是一個環,兩個指標不然會相遇;
  3. 若不是環,那麼快指標必然必慢指標先到達1;

3.2 程式碼實現

class Solution {
    public boolean isHappy(int n) {
        int fast = getNext(n);
        int slow = n;
        while(fast != 1 && fast != slow) {
            slow = getNext(slow);
            fast = getNext(getNext(fast));
        }
        return fast == 1;
    }
    public int getNext(int n) {
        int sum = 0;
        while(n != 0) {
            int tmp = n % 10;
            sum += tmp * tmp;
            n = n / 10;
        }
        return sum;
    }
}

3.3 複雜度分析

  • 時間複雜度為O(logN)
  • 空間複雜度為O(1);

四、學習地址

作者:LeetCode-Solution

連結:https://leetcode-cn.com/problems/happy-number/solution/kuai-le-shu-by-leetcode-solution/