今日は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年に爆発的な成長を示すだろう
モバイル インターネットとクラウド コンピューティング技術の急速な発展に伴い、クラウド環境で保存、共...
8月19日、2017年ヤブリ中国起業家フォーラム夏季サミットが銀川で開催されました。百度の創業者で会...
1. 検索セマンティックモデルの現状ERNIE: 知識統合による表現の強化は、中国語の NLP タス...
1. GANの紹介「食べるために一生懸命働く人、食べるために一生懸命働く人こそが人々の中で最も優れて...
[[317667]]写真: 中空の玄関マットの上で動くレインボーダッシュこの記事はLeiphone...
大規模言語モデル (LLM) は、非常に流暢で一貫性のあるテキストを短時間で生成できるため、AI 会...
[[330619]]テクノロジーとエコロジーの継続的な進化、およびアプリケーション シナリオの継続的...
人工知能やビッグデータなどの新技術の応用と推進に伴い、ビッグモデルも人気の技術となっています。もちろ...
World of Warcraft などの MMOARPG ゲームをプレイしたことがあるなら、キャラ...
近年、人工知能の応用は世界中で大きな進歩を遂げています。職場でのビジネス活動の拡大に伴い、クラウド ...
[51CTO.com からのオリジナル記事] 現在、インターネット上には機械学習 (ML)、人工知能...
人工知能は新たな変化を先導しています。近年、人工知能はテクノロジー業界から始まり、急速に生活の各分野...