PHP it's strrev()
、in Rails it's .reverse
ですが、ほとんどの言語には文字列逆関数がありません。一部には、文字に使用できる配列反転関数があります。これは大きな見落としだと思っていたのですが、それが起こりました。実際に文字列反転を何に使用しますか???
デモやレッスンで「Hello World!」を回すのを見たと思うのはこのときだけです。 「!dlroW olleH」に。
私の質問です。文字列を逆にする用途はありますか、それともまったく意味がありませんか?
。
補遺
私が予想していたよりはるかに多くの答えがあり、それらのすべてが完全に学術的であったわけではありません。私は誰も正当な例を思い付くことができないであろうお金を投入したでしょう。また、新しいことを学ぶつもりもありませんでしたが、Mark Canlasの正規表現の提案は素晴らしく、それが証明される機会を楽しみにしています。ありがとうございます。
場合によっては、入力文字列を逆にして別の方法で問題に取り組むことで、正規表現を含む問題をより簡単に記述できます。
テクニックは、Perlを教えてくれた人の好意によるものです。
さて、これはほのぼのした答えです。
「昔のこと」私はUnixの箱を所有しており、スペルチェックに使用される英語の単語の順序付けられた辞書ファイルがありました。
辞書のすべての単語を逆にして並べ替えてから、もう一度逆にして、新しいファイルを作成しました。結果は、右から左にソートされた単語のリストでした。
したがって、単語を検索した場合、その単語の隣には類似した末尾の単語があります。だから、小さな詩を作るのは簡単でした!
どんな韻を踏んでいるのかを見ると、本当に面白くなります。
私は10年以上コーダー/開発者/システム管理者であり、実際の状況でever文字列の反転が必要だったことを思い出せません。
私が考えることができる唯一の直接的なユースケースは、数値ベースの変換です。単純に行われると、プロシージャは逆の文字列を返します。ただし、少し計算するだけで、必要なスペースの量を事前に計算できるので、最後からバッファの充填を開始できます。
public bool IsPalindrome(string toCheck)
{
return toCheck == toCheck.Reverse();
}
文字列を反転する(インプレースであるかどうかにかかわらず)は、基本的なプログラミング知識についての非常に一般的なインタビューの質問です。これらの組み込み関数を欠く言語は、インタビューするのが難しいでしょう。候補者は実際に何かを知っている必要があります。1
1:これはほのぼのした答えです。
デスクトップアプリケーションが組み込みデバイスと通信し、バイト順のエンディアンを絶えず切り替えていて、データが文字列として移動される状況を見てきました。私にとってはそれで終わりです。
私はそのアプリケーションに文字列を使用しなかったでしょうが、それはまさにそれがそうだった方法です.....
<span style="unicode-bidi: bidi-override; direction:rtl;">
<?php echo strrev($emailaddress); ?>
</span>
メールアドレスをクリップボードに追加すると元に戻されるため、メールアドレスを難読化するのに最適なソリューションではありません。そして、それが人気になった場合、すぐにメールスクレイピングボットによって検出されます。
それでも、それは 推奨される です。
ASCIIは遺伝情報の最適なエンコーディングではありません(ベースタイプACGTを2ビットとしてパックできます)。それらをlonglongsの配列にパックすると、1ワードあたり32の遺伝的「文字」を取得できます。 DNAは向きを変えることができるため、両方のDNAチャンクがテストシーケンスの逆コピーであるかどうかを確認する必要があります。したがって、2ビット量のパックされた文字列を反転できることは、さまざまな種類の遺伝子分析に非常に役立ちます。
私はスパイ機関のベンチマークのアイテムとして、それをどれだけ速くビットをロングロング(実際にはロングロングの非常に長い配列)に反転させることができましたか。一度に2ビットを交換する明白な方法は、あまり明確でない方法よりもはるかに低速です。これらは、配列の転置のための適切なアルゴリズムのいくつかに関連しています。
タングレナ:あなたが言及する操作は人口カウントと呼ばれます。ビットパックデータの同様の望ましい点は、ゼロカウントの先頭と末尾です。ビットパックされたデータでできることはたくさんあります。 longlongの単一の操作は64ウェイデータパラレルであるため、実行していることがわかっている場合は、特定のタイプの計算で驚異的なパフォーマンスを得ることができます。
文字列を反転すると、整数を文字列として扱うのがはるかに簡単になります。大きな整数で数学を行うためのライブラリ関数をいくつか作成し、文字列反転を使用して算術関数をより単純にしました。
確かに、私はProject Eulerでの回答のクランキングにのみ使用しましたが、それでも元の前提はそのままです。
多分低コストの多言語サポート、左から右ではなく右から左(アラビア語など)の文字を使用する言語。もちろん、適切な文字を変更するアクセント文字に注意する必要があります...
わからないかもしれませんが、パリンドローム....を確認する必要があります
文字列を逆にする必要がある場合もあるので、私はそれが完全に役に立たないと思います。
自然言語の処理と解析では、文字列を最後から最初まで検索する方が簡単な場合があります。文字列の反転は、デバッグ、またはループを作成する別の方法として役立ちます(文字列を反転してから、インデックス0からn-1にループします)。
また、一部の言語は右から左に書かれるため、LTR/RTL言語をネイティブに認識しない環境にいる場合は、文字列リバーサーを使用できます。
文字列(一部の言語では)は文字の配列ですが、給与や在庫の変更の場合もあります。これらを横切って移動するループでは、処理する順序に関係なく、同じでなければならないいくつかの計算を実行する場合があります。完全に単体の単体テストは、それらの計算が前向きにも後向きにも同じように適用されるかどうかを確認することです。これは、追加の場合は自明であり、他のより不透明な操作の場合はそうではない可能性があります。
コンパイラについては?
おかしいですが、言語のほとんどの記号は共通のパターンで始まります。ここではハンガリー記法について話していませんが、名前空間/クラスについて考えると、多くのシンボルは実際には共通のprefixを共有します。
myproject::SomeClass::GetFoo
myproject::SomeClass::GetBar
問題は、バイナリ検索を実行するときに、一般的なプレフィックスが最終的に最悪の事態になることです。これらのプレフィックスを何度も比較することになるためです。
一方、文字列を後ろから見ると、エントロピーがはるかに大きくなります。そして突然、(トライを介した)バイナリ検索がはるかに強力になります!
C++のマングル名(gccによる)が名前空間をLASTにするために逆転されなかったのはいつも私を悩ませています:)
Strrevを使用して見た本当のworlsアプリは、ユーザーパスワードをデータベースに「判読不能」に保存することだけでした...
しかし、Cにはstrrevを使用するパターンがあることを覚えています。おそらく後で思い付くでしょう。
検索のために電話番号と特定の文字列をときどきめくります
文字列反転が使用されているのを思い出すことができるのは、「。」を確実にするために、ファイル名の解析中にそれを使用していた方法を見たときだけでした。ファイル名で見つかったのは、実際には、ファイル名と拡張子を区切る最後のドットでした。つまり、data.2010.12.08.dat
のようなファイル名を解析すると、文字列を逆にして最初のドットを見つけ、元の文字列の末尾からその位置を差し引いて、部分文字列を取得します。それが最適な方法だと言っているわけではありませんが、それが実際に行った方法です。それはpowerbuilderにあった可能性があり、関数のそのような奇妙な使用は、さまざまな自明ではない問題を回避するために一般的でした。