今日は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年に爆発的な成長を示すだろう
[[260878]] 「当社は、個人データへのアクセスを必要としないマルチパーティデータコンピューテ...
[[236501]] 「彼はただ生き残りたいだけ。どんな罪を犯したのか?」黄茂さんが亡くなった後、...
[[251560]] Nvidia は、従来のモデリングやグラフィック レンダリング エンジンではな...
[[236435]]誰でも使用できる無料のオープンソース AI ツールをいくつか見てみましょう。オー...
ディープラーニングなどのエンドツーエンドのモデルの場合、トレーニングプロセスをどのように説明し理解す...
[[408248]]最近、ディープラーニング AI を活用したビデオ監視プロジェクトに携わったことが...
[[385451]]この記事はWeChatの公開アカウント「Xinzhiyuan」から転載したもので...
現地時間5月7日、米国シアトルでMicrosoft Buildカンファレンスが開催され、マイクロソフ...
導入これら 12 の質問は、現在の面接で最も人気のある質問です。これらは非常に基本的な質問ですが、面...
[[260361]]新華社によると、ビル&メリンダ・ゲイツ財団の共同議長ビル・ゲイツ氏は最近スタンフ...
最も熱心な気候変動監視者でさえ希望を抱いている。なぜなら、人類の革新と技術が私たちをこの混乱に陥れた...
3月2日のニュースによると、数秒以内にニュース記事を生成することは、メディア業界にとって確かに非常に...