今日は2020年2月2日、「千年に一度の対称の日」として知られています。20200202は表でも裏でも同じで、どちらも「愛しています、愛しています」という意味です。多くの新婚夫婦が今日を結婚証明書を取得する日として選んだが、肺炎のため、いくつかの場所では今日の予約がキャンセルされた。 しかし、今日はこの日の意味について話すのではなく、テクノロジー関連のトピックについて話しましょう。 20200202 このように順方向と逆方向で同じ文字列を、アルゴリズムでは「回文」と呼びます。構造が異なるため、回文数、回文文字列、回文リンクリストなどに分類されます。 これにより、Leetcode のアルゴリズムにいくつかの問題が発生します。今日、他の人が結婚証明書を取得する日に、「回文」に関連するアルゴリズムの問題を確認します。 1. 回文文字列を検証する 今日の日付を文字列で表すと、「20200202」となり、回文文字列になります。 したがって、回文文字列であるかどうかを確認するメソッドを記述する場合、最も簡単な方法は文字列を反転して比較することです。
しかし、ほとんどの場合、API を直接使用することはできません。それ以外では、2 つのポインターを使用して、文字列の前後方向から内側にクランプする方法がより一般的です。
ロジックはシンプルで、1 つのループと 2 つのポインターで完了します。 ただし、これは文字列なので、文字列の長さを取得するのは簡単です。そのため、一般的なアルゴリズムの問題では、いくつかの追加条件が追加され、難易度が上がります。 たとえば、Leetcode の「125. 回文を検証する」では、指定された文字列にスペースが含まれています。 この場合、前のソリューションを修正するだけです。 2 つのポインターが移動しているときにスペースに遭遇すると、もう 1 ステップ進みます。
isLetterOrDigit() を使用すると、現在の文字が文字と数字のみであるかどうかを直接判断できます。 文字列の回文アルゴリズムについては、125 のほか、Leetcode の質問 680 も回文文字列に属します。興味があれば、調べてみてください。 2. 回文の数を確認する 回文文字列に数字のみが含まれている場合は、20200202 などの回文数字になることもあります。 回文を検証する場合、比較的簡単な方法は、回文を文字列に変換してから、文字の回文を検証するためのアルゴリズム パターンを適用することです。しかし、これは数字の特性を利用していません。 これは数値なので、割り算 / と剰余 % を使用して数値の後半部分を取り出し、反転してから、2 つの数値が等しいかどうかを比較できます。
簡単な説明: 1. まず簡単な検証を行ってください。 0 より大きい非ゼロの数値の一の位に 0 がある場合、それは間違いなく回文ではありません。対応する回文の位置はこの数値の最上位ビットであり、最上位ビットは 0 にならないためです。 2. ループを通じて、各ループで反転された数字がビットごとに生成され、元の数字の最下位ビットが削除されます。 3. ループが終了した場合、後半部分が反転されたことを意味します。次に、数値の長さが奇数か偶数かという 2 つのケースを検討します。次に、元の数値 x と、後半部分を反転した反転した数値 (reverseNumber) が同じかどうかを判断します。 ちなみに、この質問は、Leetcode の「9. 回文」の質問です。 3. 回文リストを確認する 回文文字列と回文数について説明したので、次は回文連結リストについて見てみましょう。 単一リンクリストのような特殊な構造の場合、その長さを決定するには O(n) の計算量が必要であり、先行ポインタが存在しないため、ダブルポインタを使用して前後をクランプする方法は使用できません。 もちろん、計算のためにおなじみの回文数や回文文字列に変換することもできますが、これもリンクリストの特性を利用していません。 回文リンク リストを検証するシナリオでは、高速ポインターと低速ポインターを使用してリンク リストの中間ノードを見つけ、元のリンク リストの半分を逆にしてから比較を開始できます。 効率性を高めるために、これら 2 つのステップを 1 つのループに組み合わせることができます。
最初のループの後、低速ノードはリンク リストの中央を指し、pre は元のリンク リストの前半のサブリンク リストを反転します。 次に、while ループを使用して、それらを 1 つずつ比較することで、必要な結果を得ることができます。 ちなみに、この質問は、Leetcode の「234. 回文連結リスト」です。 4. まとめの時間 今日はここまでです。20200202では回文に関するアルゴリズムの問題をいくつか確認しました。回文問題を文字列、数字、リンクリストの3方向から横に見ていった結果、どのようなルールがまとめられるでしょうか?コメント欄で議論をお待ちしています。 感染症の流行により、明日から多くの友人が在宅勤務に切り替えることになります。皆様のご多幸をお祈りいたします。 |
<<: 新型コロナウイルスが猛威を振るう中、AI技術は流れを変えることができるのか?
>>: クラウドプラットフォームにおける人工知能の応用は2020年に爆発的な成長を示すだろう
ガートナーによると、2026年までに、人工知能(AI)によって生成された顔認証のディープフェイク攻撃...
現在、革命的な変化の波が進行しており、企業が顧客や企業にサービスを提供する方法を変えていると考えられ...
1. 生産性の向上多くの組織がリモートワークに移行するにつれて、効率性を維持することが重要になります...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
ある報告書によると、自動化と人工知能は最大5年以内に人間の雇用を脅かすことになるという。このような状...
2021年スタンフォードAIインデックスレポートが正式にリリースされ、過去1年間のAIの全体的な発...
2020年の最初の月はあっという間に過ぎましたが、ドローン業界の発展は多くの原動力と章を残しました。...
マルチモーダル融合は、知覚ベースの自動運転システムにおける基本的なタスクであり、最近多くの研究者の関...
最近、SingularityNETのCEOであるベン・ゲルツェル博士は、COVID-19サミットを開...
7月16日、OpenAIが開発した人工知能チャットボット「ChatGPT」は、ユーザーと自然言語で会...