今日は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年に爆発的な成長を示すだろう
ドローンと聞いて何を思い浮かべますか?おそらくほとんどの人の答えは写真撮影でしょう。しかし、今回の疫...
AI と ML をより多くのタスクに統合すると、短期的には多くのメリットが得られますが、長期的には...
[[229439]]ビッグデータ概要編纂者:張南星、静哲、荊浩南1. 機械学習製品を効率的に開発す...
1 はじめにみなさんこんにちは、フェイ先生です。機械学習の定番フレームワークであるscikit-l...
この記事の結論から始めましょう。AI と機械学習は、ビデオ信号を 24 時間 365 日リアルタイム...
[[357616]] International Journal of Engineering an...
[[173621]]編集者注:現地時間10月9日、米国大統領選挙の2人の候補者による第2回公開討論会...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
人工知能 (AI): 私たちの日常生活、生き方、他者との関わり方に根本的な変化がもたらされるのは、第...
クラウド コンピューティングは、組織の業務、情報の保存、意思決定の方法を変え、技術革新と分析研究への...
[[216638]]韓国メディアは、中国の囲碁棋士である柯潔氏が2018年春にテンセントが開発した人...