何のために文字列の反転を使用しますか?[閉まっている]


15

PHP strrev()では、Rails .reverseではですが、ほとんどの言語には文字列の逆関数はありません。いくつかは、文字に使用できる配列反転関数を持っています。私はこれは大きな見落としだと思っていましたが、それは私に起こりました、あなたは実際に文字列リバースを何のために使用しますか?

私がそれを見たと思うことができるのは、デモとレッスンで「Hello World!」をオンにすることだけです。「!dlroW olleH」に。

私の質問は 文字列を反転する用途はありますか、それとも完全に無意味ですか?

補遺

私が予想していたより多くの答えがありましたが、それらすべてが完全にアカデミックなわけではありませんでした。私は誰も正当な例を思い付かせることができないお金を入れていただろう。また、新しいことを学ぶとは思いませんでしたが、Mark Canlasの正規表現の提案は素晴らしく、それを証明する機会を楽しみにしています。ありがとうございます。


@clockworkgeek-お気に入りの言語で文字列の反転を行うように候補者に依頼すると、言及した基本的な機能を思い付かない人が驚くでしょう。次に、ループを自分で実装するためにループを思い付かないものがいくつあります。
justkt

@justkt-それは起こるのを待っている他の質問全体ですが、代わりにTopCoderのトピックかもしれません。
時計仕掛け

6
運転中にバックミラーで読むことができるテキストメッセージを送信するため、警官は気付かないでしょう。
ジェフ

@justkt-それを行うために反復ループを作成しなければならなかった場合、中間に到達するまで反対の端から文字を交換して開始します。しかし、その後、どのように2つの値を交換しますか?ここで私が今までに与えられた最高の答えは単純です:a ^= b; b ^= a; a ^= b;
clockworkgeek

1
私は文字列の反転に文字列反転を使用します;)
Muad'Dib

回答:


19

Sexegers

入力文字列を逆にして別の方法で問題に取り組むことで、正規表現に関連する問題をより簡単に作成できる場合があります。

Perlを教えてくれた男性の好意によるテクニック。

PerlMonksのSexeger


ありがとうございました。何かの最後を見つけるための非常に便利なトリック。当然のことです。
時計仕掛け

私はこれを何年もやっています。メールアドレスの解析に役立ちます。
sal

23

まあ、これは冗談です。

「昔」Unixボックスを所有していて、スペルチェックに使用する英語の単語の辞書ファイルがありました。

辞書内のすべての単語を元に戻し、ソートしてから再び元に戻すことで、新しいファイルを作成しました。結果は、右から左にソートされた単語のリストです。

そのため、単語を検索した場合、その単語の隣には同様の語尾を持つ単語があります。だから小さな詩を作るのは簡単でした!

何が何と韻を踏むかを見ると、本当に楽しませることができます。


13

私は約10年間コーダー/開発者/システム管理者でしたが、実際の状況で文字列の反転が必要だったことを思い出せません。

私が考えることができる唯一の即時のユースケースは、数値ベースの変換です。単純に行われ、プロシージャは逆の文字列を返します。ただし、少し計算すれば、必要なスペースの量を前もって計算できるため、最後からバッファーの充填を開始できます。


1
文字列を逆にするよりも少しの計算が高価になる可能性があるため、プラットフォーム(ARM、MIPS、x86)でベンチマークを行った後、文字列の逆を使用する場合があります。多分。
ザンリンクス

バッファを最後から埋め、memmove終了したらa を使用して開始できます。おそらく、必要な桁数を計算するためにlog(n)/ log(base)を計算するよりも安価です。
パトリックシュリューター

12
public bool IsPalindrome(string toCheck)
{
    return toCheck == toCheck.Reverse();
}

1
うん-候補者がパリンドロームチェッカーを書いて、ほとんどがこれを行うインタビュースクリーニングが実際にあります。ただし、候補が0to n/2を反復処理し、反対側の文字を比較する方がより良いです。
ニコール

@Renesis:またwhile ( (*p == *q) && (p <= q) {p++; q--} return p > q;、Cおよびその他のポインター言語で、文字列の先頭にpを、文字列の末尾にqを設定できます。
マイケルK

4
「回文チェッカー」はあまり有用ではないが、「回文チェッカーを書く」には少なくとも目的があると思う。
時計仕掛け

2
面接でArray.Reverse、彼らは文字列を逆に私に尋ねた、彼らは、これは何のstring.Rverse()だから、私は文字配列に文字列を変換していない覚えている」と述べたとしました。
ジャック・マルケッティ

それはかなりニッチな使用であり、一般的に言語/ライブラリに含める価値があると言うものではありません!
ダンディプロ

8

インタビュー!

文字列の反転(インプレースまたは非インプレース)は、プログラミングの基礎知識に関する非常に一般的なインタビューの質問です。これらの組み込み関数を欠いている言語は、インタビューするのが難しいでしょう。候補者は実際に何かを知る必要があります。1


1:これは冗談です。


6

デスクトップアプリケーションが組み込みデバイスと通信し、バイトオーダーのエンディアンを絶えず切り替えており、データが文字列として移動される状況を見てきました。それは私にとってはそれについてです。

私はそのアプリケーションに文字列を使用しなかったでしょうが、それはそれがあった方法で.....


この回答の+1。少なくとも実際的な例ですが、私も別の方法で、おそらく異なるエンディアンであるプリミティブ型を選択することでそれを行ったでしょう。
時計仕掛け

5
<span style="unicode-bidi: bidi-override; direction:rtl;">
    <?php echo strrev($emailaddress); ?>
</span>

電子メールアドレスを難読化するのに最適なソリューションではありません。クリップボードに追加すると、元に戻されるためです。そして、人気が出れば、すぐにメールスクレイピングボットによって検出されます。

それでも、提案されています。


1
そして、使用中の最も人気のある難読化は、その記事全体で1つの文のみを与えられました...画像としてエンコードします。
時計仕掛け

1
@clockworkgeek、それは人気のあるものかもしれませんが、私見では効果的なソリューションの最悪です-生成するのは非常に簡単ではなく、HTMLに埋め込まれていません(速度、画像のストレージ、サーバー負荷) CSSを使用し、文字列の反転と同じようにユーザーエクスペリエンスが悪いため、覚えて再入力する必要があります。そして、おそらく私が考えていないより多くの問題。
ニコール

不思議なことに、ハーベスタで最も簡単にデコードできるATとDOTを使用すると、ハーベスティングを防ぐのにほぼ完璧な効果が得られます。シンプルにすることは、それほど悪い考えではありません。
ジョーリSebrechts

5

ASCIIは遺伝情報の最適なエンコードではありません(基本タイプACGTは2ビットとしてパックできます)。それらをlonglongの配列に詰めると、単語ごとに32個の遺伝的「文字」が得られます。DNAは好転する可能性があるため、テストシーケンスの逆コピーの両方に対してDNAのチャンクをチェックする必要があります。したがって、2ビット量のパックされた文字列を反転できることは、さまざまな種類の遺伝子分析に非常に役立ちます。

私はスパイ機関のベンチマークのアイテムとして、どのくらいの速さでビットを長い間逆にすることができますか(実際には非常に長い長い長い配列)。一度に2ビットを交換する明白な方法は、それほど明白でない方法よりもはるかに遅いです。これらは、インプレース配列転置用のいくつかのきちんとしたアルゴリズムに関連しています。

Tangurena:参照する操作は、人口カウントと呼ばれます。ビットパックデータの同様の望ましいことは、先頭と末尾のゼロカウントです。ビットパックされたデータでできることは、本当にすてきなことがたくさんあります。longlongでの単一の操作は64wayデータ並列であるため、自分が何をしているのかを知っていれば、特定の種類の計算で驚くべきパフォーマンスを得ることができます。


興味深いトピック、ビットフィールドをどのように反転しますか?
clockworkgeek

「ビットフィールドをどのように反転しますか?」
オメガケンタウリ

2
1つのアプローチはテーブルルックアップです。テーブルを使用して、バイトをビットリバースできます。だから、個々のバイトでそれを行うことができます。また、いくつかのビットを一度だけ移動する方法もあります...少し巧妙で、トレードオフ(テーブルサイズと操作の数など)を調整できます。
オメガケンタウリ

5

逆の文字列で作業する方が簡単です。

文字列を逆にすれば、整数を文字列として扱うのがずっと簡単になります。大きな整数で数学を行うためのライブラリ関数をいくつか作成し、文字列の反転を使用して算術関数を単純化しました。

確かに、私はそれをProject Eulerで答えを出すためだけに使用しましたが、それでも元の前提は保持されます。


+1。数字の文字列表現を使用する場合、逆表現は非常に役立ちます。通常、標準ライブラリは通常の順序で番号を表します。
back2dos

3

おそらく、左から右ではなく、右から左への文字(アラビア語など)を使用する言語に対する低コストの多言語サポートです。もちろん、正しい文字を変更するアクセント文字に注意する必要があります...


2

多分誰かが回文のチェックをする必要があります...

文字列を逆にする必要がある状況があるかもしれないので、完全に役に立たないとは思いません。


それに続く質問は、現実世界で回文をチェックする必要があったときでしょうか?繰り返しますが、私はアルゴリズムのレッスンに関心がある人を見たことがありません。
時計仕掛け

:例えば、このようなjimsabo.com/palindrome.html
Darknight

おそらく他の用途もあると思いますが、それはドメイン固有のものです。たとえば、文字列検索が前方検索用に最適化されていて、最後の出現に対して複数の検索を実行したい場合は、最初に逆にしたい場合があります。ただし、これは最適化であり、証明可能なケースがない限り実行しないでください。文字列値のハッシュを生成するためのアルゴリズムを想像できます。これは、より良いハッシュ特性を提供する場合に、可能であれば逆の末尾を使用することを望みます。
スコットホイットロック

2

自然言語の処理と解析では、文字列の末尾から先頭までを検索する方が簡単な場合があります。文字列の反転は、デバッグに役立つか、ループを記述する別の方法として役立ちます(文字列を反転してから、インデックス0からn-1にループします)。

また、一部の言語は右から左に記述されているため、LTR / RTL言語をネイティブに認識しない環境にいる場合は、文字列リバースを使用できます。

文字列(一部の言語では)は文字の配列ですが、給料や在庫の変更にもなります。これらを移動するループでは、それらを処理する順序に関係なく同じである計算を行う場合があります。完全に色彩豊かな単体テストは、計算が同じことを行っているか、行っているかを確認することです。これは、他のより不透明な操作ではなく、追加では自明なことかもしれません。


1

コンパイラの場合

おもしろいですが、言語のほとんどの記号は共通のパターンから始まります。ここではハンガリー語表記については説明していませんが、名前空間/クラスについて考えると、実際には多くのシンボルが共通の接頭辞を共有します

myproject::SomeClass::GetFoo
myproject::SomeClass::GetBar

問題は、バイナリ検索を行うとき、共通のプレフィックスが最終的な最悪の結果になることです。これらのプレフィックスを何度も比較することになります。

一方、文字列を後方に見ると、はるかに多くのエントロピーが見られます!そして、突然、バイナリ検索(トライ)がはるかに強力になります!

ネームスペースを最後に置くために、C ++でマングルされた名前(gccによる)が逆にされていないことは常に私を悩ませていました:)


0

検索のために電話番号と特定の文字列を時々ひっくり返します


0

文字列の反転が使用されていることを思い出すことができるのは、「。」ファイル名で見つかったのは、実際には拡張子からファイル名を分離した最後のドットでした。つまり、などのファイル名を解析してdata.2010.12.08.dat、文字列を逆にし、最初のドットを見つけ、元の文字列の末尾からその位置を減算して、部分文字列を取得します。私はそれがそれを行う最適な方法だと言っているわけではありませんが、それはそれがしたことです。このような機能の奇妙な使用が、さまざまな非自明な問題を回避するために一般的であったPowerbuilderにあった可能性があります。


0

strrevを使用して見た唯一の実際のworlsアプリは、データベースに「読み取り不可能」なユーザーパスワードを保存することでした...

しかし、Cにはstrrevを使用するパターンがあることを思い出すことができます。後で考え出すかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.