LeetCode 4月30每日一題 LeetCode202. 快樂數

問題描述:

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

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

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

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

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

解題思路:

使用一個map鍵值對來存儲,計算過的數字,如果後面重複出現過了,則代表會循環

class Solution {
public:
    bool isHappy(int n) {
        if(n==1) return true;
        int tmp = n;
        int sum = 0;
        map<int,int> m;
        m[n]=1;
        while(sum!=n && sum!=1){
            sum = sumofnum(tmp);
            if(m[sum]) return false;
            m[sum]=1;
            tmp = sum;
        }
        if(sum==1) return true;
        else return false;
    }
    int sumofnum(int n){
        int sum = 0;
        while(n){
            sum += (n%10)*(n%10);
            n = n/10;
        }
        return sum;
    }
};

後面看其他題解,其實用數學原理解釋,所有的不快樂數都會進入下列循環

所有不快樂數的數位平方和計算,最後都會進入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循環中。

可以更改判斷條件,節省空間複雜度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章