Wofür verwenden Sie die Zeichenfolgenumkehrung? [geschlossen]

15

In PHP ist es das strrev(), in Rails ist es das .reverse, aber die meisten Sprachen haben keine String-Reverse-Funktion. Einige haben Array-Umkehrfunktionen, die für Zeichen verwendet werden können. Ich dachte, das müsste ein großes Versehen sein, aber dann kam mir der Gedanke, wofür würdest du eigentlich die umgekehrte Zeichenfolge verwenden?

Ich kann nur denken, dass ich es in Demos und Lektionen gesehen habe, um "Hello World!" in "! dlroW olleH".

Meine Frage ist; Gibt es eine Verwendung zum Umkehren einer Zeichenfolge oder ist es völlig sinnlos?

.

Nachtrag

Es gab viel mehr Antworten, als ich erwartet hatte, und nicht alle waren rein akademisch. Ich hätte Geld investiert, das niemand mit einem legitimen Beispiel versehen könnte. Ich hätte auch nicht gedacht, dass ich etwas Neues lernen würde, aber Mark Canlas 'Regex-Vorschlag ist einfach genial und ich freue mich darauf, dass er sich bewähren kann. Dank an alle.

Uhrwerkgeek
quelle
@clockworkgeek - Wenn Sie einen Kandidaten bitten, die Zeichenfolge in seiner bevorzugten Sprache umzukehren, werden Sie überrascht sein, wie viele nicht auf die von Ihnen erwähnte Grundfunktion kommen. Wie viele können sich dann keine Schleife ausdenken, um sie selbst zu implementieren.
8.
@justkt - Das ist eine ganz andere Frage, die darauf wartet, beantwortet zu werden, könnte aber stattdessen ein Thema für TopCoder sein.
Uhrwerk
6
Senden einer SMS, die während der Fahrt im Rückspiegel gelesen werden kann, damit die Polizei nichts davon merkt.
JeffO
@justkt - Wenn ich dazu eine iterative Schleife schreiben müsste, würde ich an entgegengesetzten Enden beginnen und Zeichen tauschen, bis die Mitte erreicht ist. Aber wie tauscht man dann zwei Werte aus? Hier ist einfach die beste Antwort, die mir je gegeben wurde:a ^= b; b ^= a; a ^= b;
clockworkgeek
1
Ich benutze String-Umkehrung zum Umkehren von Strings;)
Muad'Dib

Antworten:

19

Sexeger

Manchmal können Probleme mit regulären Ausdrücken einfacher geschrieben werden, indem die Eingabezeichenfolge umgekehrt und das Problem auf andere Weise gelöst wird.

Technik mit freundlicher Genehmigung des Mannes, der mir Perl beigebracht hat.

Sexeger auf PerlMonks

Mark Canlas
quelle
Vielen Dank. Ein sehr praktischer Trick, um das Letzte von etwas zu finden. Zur Kenntnis genommen.
Uhrwerk
Ich mache das schon seit Jahren. Hilft beim Parsen von E-Mail-Adressen.
Sal
23

Nun, das ist eine humorvolle Antwort.

"Damals" besaß ich eine Unix-Box mit einer bestellten Wörterbuchdatei mit englischen Wörtern, die für die Rechtschreibprüfung verwendet wurde.

Ich habe eine neue Datei erstellt, indem ich alle Wörter im Wörterbuch umgedreht, sortiert und dann wieder umgedreht habe. Das Ergebnis war eine Liste von Wörtern, die von rechts nach links sortiert waren.

Wenn Sie also nach einem Wort suchen, werden neben diesem Wort Wörter mit ähnlichen Endungen angezeigt. So war es einfach, kleine Gedichte zu machen!

Sie können sich wirklich amüsieren, wenn Sie sehen, was sich mit was reimt.

Mike Dunlavey
quelle
13

Ich bin seit ~ 10 Jahren ein Programmierer / Entwickler / Systemadministrator und kann mich nicht erinnern, jemals in realen Situationen einen Stringwechsel benötigt zu haben.

Der einzige unmittelbare Anwendungsfall, an den ich denken kann, ist die Konvertierung auf der Basis von Zahlen: Wenn die Prozedur naiv durchgeführt wird, wird eine umgekehrte Zeichenfolge zurückgegeben. Mit ein wenig Mathematik können Sie jedoch den benötigten Speicherplatz im Voraus berechnen, sodass Sie den Puffer vom Ende an füllen können.

zvrba
quelle
1
Möglicherweise ist ein bisschen Mathe teurer als das Umkehren der Zeichenfolge. Nach dem Benchmarking auf Ihrer Plattform (ARM, MIPS, x86) können Sie eine Zeichenfolgenumkehrung verwenden. Könnte sein.
Zan Lynx
Sie können den Puffer vom Ende aus füllen und zum Abschluss ein memmovebis zum Anfang verwenden. Es ist wahrscheinlich billiger als log (n) / log (base) zu berechnen, um die Anzahl der erforderlichen Stellen zu berechnen.
Patrick Schlüter
12
public bool IsPalindrome(string toCheck)
{
    return toCheck == toCheck.Reverse();
}
Scott Whitlock
quelle
1
Ja - wir haben tatsächlich ein Interview-Screening, bei dem Kandidaten einen Palindrom-Checker schreiben und die meisten tun dies. Mir gefällt es jedoch besser, wenn die Kandidaten von 0bis iterieren n/2und den Charakter am anderen Ende vergleichen.
Nicole
@Renesis: Sie können auch Folgendes tun: Festlegen des p-Anfangs der Zeichenfolge, des q-Endes der Zeichenfolge while ( (*p == *q) && (p <= q) {p++; q--} return p > q;in C und anderen Zeigersprachen.
Michael K
4
Ich nehme an, während ein "Palindrom-Checker" nicht besonders nützlich ist, hat "Palindrom-Checker schreiben" zumindest einen Zweck.
Uhrwerk
2
Bei einem Interview baten sie mich, eine Zeichenfolge umzukehren, und sie sagten: "Merken Sie sich diese Zeichenfolge nicht. Reverse (). Also habe ich die Zeichenfolge in ein Zeichenarray konvertiert und Array.Reverse
Jack Marchetti
Das ist eine hübsche Nischenverwendung und keine, von der Sie im Allgemeinen sagen würden, dass sie es wert wäre, in Sprache / Bibliothek aufgenommen zu werden!
Dan Diplo
8

Interviews!

Das Umkehren eines Strings (an Ort und Stelle oder nicht) ist eine sehr häufige Interviewfrage für grundlegende Programmierkenntnisse. Eine Sprache ohne diese eingebauten Funktionen wäre schwierig zu interviewen. Der Kandidat müsste eigentlich etwas wissen. 1


1: Dies ist eine humorvolle Antwort.

Josh K
quelle
6

Ich habe Situationen erlebt, in denen eine Desktop-Anwendung mit eingebetteten Geräten sprach und die Endianität in Byte-Reihenfolge ständig wechselte und Daten als Zeichenfolgen verschoben wurden. Das ist es aber für mich.

Ich hätte für diese Anwendung keine Strings verwendet, aber so war es auch .....

Whatsisname
quelle
+1 für diese Antwort. Es ist zumindest ein praktisches Beispiel, obwohl ich es auch anders gemacht hätte, vielleicht indem ich primitive Typen gewählt hätte, die unterschiedlich enddisch sind.
Uhrwerk
5
<span style="unicode-bidi: bidi-override; direction:rtl;">
    <?php echo strrev($emailaddress); ?>
</span>

Nicht die beste Lösung, um eine E-Mail-Adresse zu verschleiern, da sie beim Hinzufügen zur Zwischenablage immer noch umgekehrt ist. Und wenn es populär würde, würde es bald von E-Mail-Scraping-Bots entdeckt werden.

Trotzdem wurde es vorgeschlagen .

Nicole
quelle
1
Und die am häufigsten verwendete Verschleierung wurde in diesem ganzen Artikel nur mit einem einzigen Satz versehen ... Codierung als Bild.
Uhrwerk
1
@clockworkgeek, es mag eine beliebte sein, aber meiner Meinung nach ist es die schlechteste der effektiven Lösungen - nicht super einfach zu generieren, nicht in HTML eingebettet (Geschwindigkeit, Speicherung von Bildern, Serverlast), sieht fehl am Platz aus, kann nicht gestaltet werden mit CSS und der gleichen schlechten Benutzererfahrung wie bei der Umkehrung von Zeichenfolgen, wenn Sie sich daran erinnern und es erneut eingeben müssen. Und wahrscheinlich mehr Probleme, an die ich nicht denke.
Nicole
Merkwürdigerweise hat die Verwendung von AT und DOT, die für einen Mähdrescher am einfachsten zu entschlüsseln sind, eine nahezu perfekte Wirksamkeit bei der Verhinderung der Ernte. Manchmal ist es gar nicht so schlecht, es einfach zu halten.
Joeri Sebrechts
5

ASCII ist nicht die beste Kodierung für genetische Informationen (Sie können die Basistypen ACGT als 2bits packen). Packen Sie sie in eine Reihe von Longlongs und Sie erhalten 32 genetische "Buchstaben" pro Wort. DNA kann sich umdrehen, so dass Sie einen DNA-Block mit beiden Kopien einer Testsequenz vergleichen müssen. Die Möglichkeit, einen gepackten String mit 2-Bit-Mengen umzukehren, kann für verschiedene Arten der genetischen Analyse sehr nützlich sein.

Ich hatte als Gegenstand einen Benchmark für Spionageagenturen, wie schnell man die Bits lange umkehren kann (eigentlich eine sehr lange Reihe von Long-Longs). Die offensichtliche Methode zum Austauschen von 2bits auf einmal ist viel langsamer als die weniger offensichtlichen Methoden. Diese beziehen sich auf einige der sauberen Algorithmen für die In-Place-Array-Transposition.

Tangurena: Die Operation, auf die Sie sich beziehen, wird als Bevölkerungszahl bezeichnet. Ähnliche Wünsche für Bit-gepackte Daten sind eine führende und eine nachfolgende Nullzählung. Es gibt viele wirklich nette Dinge, die man mit Bit-gepackten Daten machen kann. Eine einzelne Operation auf einer langen Strecke umfasst 64-Wege-Daten parallel. Wenn Sie also wissen, was Sie tun, können Sie für bestimmte Arten von Berechnungen eine unglaubliche Leistung erzielen.

Omega Centauri
quelle
Interessantes Thema, wie würden Sie ein Bitfeld umkehren?
Uhrwerk
"Wie würden Sie ein Bitfeld umkehren?"
Omega Centauri
2
Ein Ansatz ist die Tabellensuche. Sie können ein Byte mithilfe einer Tabelle umkehren. Das können Sie also für die einzelnen Bytes tun. Es gibt auch Möglichkeiten, mehrere Bits und einmal zu verschieben ... Ein bisschen Cleverness und Kompromisse (Tabellengröße im Verhältnis zur Anzahl der Operationen usw.), und Sie können versuchen, dies zu optimieren.
Omega Centauri
5

Alles, wo es einfacher ist, mit der umgekehrten Saite zu arbeiten.

Das Arbeiten mit Ganzzahlen als Zeichenfolgen ist viel einfacher, wenn die Zeichenfolgen umgekehrt werden. Ich habe einige Bibliotheksfunktionen zum Rechnen mit großen ganzen Zahlen erstellt und die Stringumkehr verwendet, um die arithmetischen Funktionen zu vereinfachen.

Zugegeben, ich habe es nur verwendet, um Antworten auf Project Euler zu finden, aber die ursprüngliche Prämisse ist immer noch gültig.

Axt
quelle
+1. Bei der Verwendung von Zeichenfolgendarstellungen von Zahlen ist die umgekehrte Darstellung sehr hilfreich. und normalerweise repräsentiert die Standardbibliothek Zahlen in der normalen Reihenfolge.
back2dos
3

Möglicherweise kostengünstige mehrsprachige Unterstützung für Sprachen, die Buchstaben von rechts nach links verwenden (z. B. Arabisch), anstatt von links nach rechts. Natürlich muss man auf Akzentzeichen achten, die das richtige Zeichen modifizieren ...

Zyklop
quelle
2

Ich weiß nicht, vielleicht hat jemand ein brennendes Bedürfnis, nach Palindromen zu suchen ...

Ich denke nicht, dass es völlig nutzlos ist, da es durchaus Situationen geben kann, in denen man in der Lage sein muss, eine Saite umzukehren.

Dunkle Nacht
quelle
Die anschließende Frage wäre, wann Sie jemals ein Palindrom in der realen Welt untersuchen mussten. Wieder habe ich nur jemanden gesehen, der sich um Algorithmusunterricht kümmert.
Uhrwerk
wie diese zum Beispiel: jimsabo.com/palindrome.html
Darknight
Ich denke, es gibt wahrscheinlich andere Verwendungen, aber es ist domänenspezifisch. Wenn beispielsweise die Zeichenfolgensuche für die Vorwärtssuche optimiert wurde und Sie mehrere Suchen für das letzte Vorkommen durchführen möchten, möchten Sie diese möglicherweise zuerst umkehren. Dies wäre jedoch eine Optimierung und sollte nicht durchgeführt werden, es sei denn, es gibt einen nachweisbaren Grund dafür. Ich könnte mir einen Algorithmus vorstellen, mit dem ein Hash eines String-Werts generiert werden kann, der das möglicherweise umgekehrte Tail-End verwenden soll, wenn er bessere Hash-Eigenschaften bietet.
Scott Whitlock
2

Bei der Verarbeitung und Analyse natürlicher Sprache ist es manchmal einfacher, eine Zeichenfolge vom Ende bis zum Anfang zu suchen. Ein String-Reverse wäre nützlich zum Debuggen oder als alternative Methode zum Schreiben der Schleife (kehren Sie den String um und schleifen Sie dann von Index 0 nach n-1).

Außerdem werden einige Sprachen von rechts nach links geschrieben, sodass ein String-Umkehrer verwendet werden kann, wenn Sie sich in einer Umgebung befinden, in der LTR / RTL-Sprachen von Haus aus nicht erkannt werden.

Eine Zeichenfolge (in einigen Sprachen) besteht aus einer Reihe von Zeichen, kann aber auch aus Gehaltsschecks oder Inventarmodifikationen bestehen. In einer Schleife, die diese durchläuft, können Sie einige Berechnungen durchführen, die unabhängig von der Reihenfolge, in der Sie sie verarbeiten, gleich sein sollten. Ein perfekter Cromulent-Unit-Test wäre, zu prüfen, ob die Berechnungen vorwärts oder rückwärts gleich sind. Dies könnte für die Hinzufügung trivial offensichtlich sein, möglicherweise nicht für andere undurchsichtigere Operationen.

MatthewMartin
quelle
1

Für Compiler?

Es ist amüsant, aber die meisten Symbole in einer Sprache beginnen mit einem gemeinsamen Muster. Ich spreche hier nicht von ungarischer Notation, aber wenn Sie an Namespace / Klassen denken, dann haben viele Symbole tatsächlich ein gemeinsames Präfix .

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

Das Problem ist, dass bei einer binären Suche häufig verwendete Präfixe das Schlimmste sind, mit dem Sie enden können, da Sie diese Präfixe am Ende immer wieder vergleichen.

Wenn Sie sich die Saiten jedoch rückwärts ansehen, werden Sie viel mehr Entropie sehen! Und dann wird plötzlich eine binäre Suche (über einen Trie) viel leistungsfähiger!

Es hat mich immer gestört, dass C ++ entstellte Namen (von gcc) nicht umgekehrt wurden, um den Namespace LAST zu setzen :)

Matthieu M.
quelle
0

Ich drehe von Zeit zu Zeit Telefonnummern und bestimmte Zeichenfolgen für die Suche um

Don
quelle
0

Das einzige Mal, an das ich mich erinnern kann, dass die Umkehrung von Zeichenfolgen verwendet wurde, war eine Funktion, die ich vor langer Zeit beim Analysieren von Dateinamen verwendet habe, um sicherzustellen, dass das '.' Es war in der Tat der letzte Punkt, der den Dateinamen von der Endung trennte. Wenn Sie einen Dateinamen wie folgt analysieren data.2010.12.08.dat, kehren Sie die Zeichenfolge um, suchen den ersten Punkt, subtrahieren diese Position vom Ende der ursprünglichen Zeichenfolge und nehmen die Teilzeichenfolge. Ich sage nicht, dass dies der optimale Weg ist, aber genau das hat es getan. Möglicherweise gab es Powerbuilder, bei denen es häufig vorkam, dass Funktionen so seltsam eingesetzt wurden, um verschiedene nicht offensichtliche Probleme zu umgehen.

GroßmeisterB
quelle
0

Die einzige echte worls-App, die ich mithilfe von strrev gesehen habe, war das Speichern von Benutzerpasswörtern, die nicht lesbar sind, in der Datenbank ...

Aber ich kann mich daran erinnern, dass es in C ein Muster gibt, mit dem man die strrev verwenden kann. Vielleicht habe ich es später herausgefunden.


quelle