ASP.NET CORE 依賴注入服務生命週期
阿新 • • 發佈:2021-02-05
一、需求
編寫一個演算法來判斷一個數 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的數,發現該數在迴圈過程中會進入無限的迴圈,比如2->4->16->37->......->37->......,從37開始就開始在這個圈裡;③該數會越來越大,這裡也需要歸納,我們取每一位的最大數,求其平方和,比如9,99,999,......,會發現不管給定的n有多大,它的平方和一定會降低到243以內,那麼情況③就被排除了;
- 使用雜湊表儲存每一個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 複雜度分析
- 時間複雜度為;
- 空間複雜度為;
三、快慢指標
3.1 思路分析
- 根據上一種方法的分析,有兩種情況①n迴圈後最終得到1;②n迴圈會產生一個環;
- 這個環可以看作一個虛擬的連結串列,那麼情況②就轉換為判斷連結串列是否有一個環,故利用弗洛伊德迴圈查詢演算法,定義快指標和慢指標,快指標每次移動兩步,慢指標每次移動一步,如果是一個環,兩個指標不然會相遇;
- 若不是環,那麼快指標必然必慢指標先到達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(1);
四、學習地址
作者:LeetCode-Solution
連結:https://leetcode-cn.com/problems/happy-number/solution/kuai-le-shu-by-leetcode-solution/