[アルゴリズムブレイクスルー] ダブルポインター - ハッピーナンバー (3)

目次

1. トピック分析

2. アルゴリズム原理

3. コードの書き方

最後に次のように書きます。


1. トピック分析

トピックリンク: 202. ハッピーナンバー - Leetcode

この質問のタイトルも分かりやすいですね。

タイトルにある例を見るとわかりやすいです。

ただし、1 点注意してください。無限ループは最終的に 1 に到達できない可能性があります。

このとき、彼が無線ループであることをどのように判断するかを考えなければなりません。

実際、二乗和に同じ数字が再び現れたとき、

これは、彼が無限ループに入っていることを示しています。例を見てみましょう。

2 が幸せな数字かどうかを計算すると、再び 4 という数字が現れたとき、

彼が無限ループに入っていることが分かります。 

2. アルゴリズム原理

私たちが想像できるのは、

タイトルにある 2 つの状況は、実際には循環しています。

それが幸せな数字であれば、1 を取得するためにループし続けます。

幸せな数字でない場合は、独自のリズムに従って循環し、1 に到達することはありません。

現時点では、高速ポインタと低速ポインタのアイデアを使用してこの問題を解決できます。

1 つのポインタが 2 歩進み、1 つのポインタが 1 歩進みます。2 つのポインタが交わるとき、

彼らはサイクルを開始したに違いありません、そしてもし彼らが会えば、

値 1 は幸せな数であり、値が 1 でない場合、それは幸せな数ではないことを示します。

3. コードの書き方

class Solution {
public:
    bool isHappy(int n) {
        int fast = n, slow = n;
        while(true) {
            slow = Sum(slow);
            fast = Sum(Sum(fast));
            if(fast == slow) break;
        }
        return fast == 1;
    }
private:
    int Sum(int n) {
        int sum = 0;
        while(n) {
            int tmp = n % 10;
            sum += tmp * tmp;
            n /= 10;
        }
        return sum;
    }
};

最後に次のように書きます。

以上が今回の記事の内容となります、読んでいただきありがとうございます。

何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。

記事の内容に抜けや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメントエリアで指摘してください〜

おすすめ

転載: blog.csdn.net/Locky136/article/details/131549668