Per cosa usi l'inversione di stringa? [chiuso]


15

In PHP è strrev(), in Rails è .reverse, ma la maggior parte delle lingue non ha alcuna funzione di inversione delle stringhe. Alcuni hanno funzioni di inversione di array che possono essere utilizzate sui caratteri. Stavo pensando che questo doveva essere un grosso svantaggio, ma poi mi è venuto in mente, cosa useresti per usare la stringa reverse ???

L'unica volta che riesco a pensare di aver visto è nelle demo e nelle lezioni che si trasforma "Hello World!" in "! dlroW olleH".

La mia domanda è; È utile invertire una stringa o è completamente inutile?

.

appendice

Ci sono state molte più risposte che avevo previsto e non tutte erano interamente accademiche. Avrei messo soldi che nessuno avrebbe potuto dare un esempio legittimo. Inoltre, non pensavo che avrei imparato qualcosa di nuovo, ma il suggerimento regex di Mark Canlas è semplicemente geniale e non vedo l'ora che possa dimostrarsi. Grazie a tutti.


@clockworkgeek - se chiedi a un candidato di eseguire l'inversione di stringa nella loro lingua preferita, rimarrai sorpreso da quanti non escono con la funzione di base che hai citato. Quindi quanti non riescono a creare un ciclo per implementarlo da soli.
dall'8

@justkt - Questa è un'altra domanda in attesa di accadere, ma potrebbe essere un argomento per TopCoder.
clockworkgeek,

6
Per inviare un messaggio di testo che potrebbe essere letto nello specchietto retrovisore durante la guida, in modo che la polizia non se ne accorga.
JeffO,

@justkt - Se dovessi scrivere un ciclo iterativo per farlo, inizierei dalle estremità opposte scambiando i caratteri fino a raggiungere il centro. Ma allora come si scambiano due valori? Ecco semplicemente la migliore risposta che mi sia mai stata data:a ^= b; b ^= a; a ^= b;
clockworkgeek

1
io uso l'inversione di stringa per invertire le stringhe;)
Muad'Dib

Risposte:


19

Sexegers

A volte, i problemi che coinvolgono espressioni regolari possono essere più facilmente scritti facendo invertire la stringa di input e affrontando il problema in modo diverso.

Tecnica per gentile concessione dell'uomo che mi ha insegnato Perl.

Sexeger su PerlMonks


Grazie. Un trucco molto utile per trovare l'ultimo di qualcosa. Debitamente annotato.
clockworkgeek,

Lo sto facendo da anni. Aiuta ad analizzare gli indirizzi e-mail.
sal

23

Bene, questa è una risposta ironica.

"Back in the day" Possedevo una scatola Unix, e aveva un file dizionario ordinato di parole inglesi, usato per il controllo ortografico.

Ho creato un nuovo file invertendo tutte le parole nel dizionario, ordinandolo e quindi invertendole di nuovo. Il risultato è stato un elenco di parole ordinate da destra a sinistra.

Quindi se la cercassi per una parola, accanto a quella parola ci sarebbero parole con finali simili. Quindi è stato facile fare piccole poesie!

Puoi davvero divertirti quando vedi cosa fa rima con cosa.


13

Sono stato un programmatore / sviluppatore / amministratore di sistema per ~ 10 anni e non ricordo di aver mai avuto bisogno di invertire la stringa in situazioni di vita reale.

L'unico caso d'uso immediato a cui riesco a pensare è la conversione in base numerica: eseguita ingenuamente, la procedura restituisce una stringa invertita. Tuttavia, con un po 'di matematica, è possibile calcolare in anticipo la quantità di spazio necessario, in modo da poter iniziare a riempire il buffer dalla fine.


1
È possibile che un po 'di matematica sia più costoso dell'inversione della stringa, quindi dopo aver effettuato il benchmarking sulla tua piattaforma (ARM, MIPS, x86) potresti usare un'inversione di stringa. Può essere.
Zan Lynx,

È possibile riempire il buffer dalla fine e utilizzare memmovea all'inizio al termine. Probabilmente è più economico del calcolo di log (n) / log (base) per calcolare il numero di cifre necessarie.
Patrick Schlüter,

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

1
Sì, in realtà abbiamo una proiezione di interviste in cui i candidati scrivono una pedina palindromo e la maggior parte lo fa. Tuttavia, mi piace di più quando i candidati iterare da 0al n/2e confrontare il carattere alla fine opposta.
Nicole,

@Renesi: puoi anche fare: impostare p inizio della stringa, q fine della stringa, while ( (*p == *q) && (p <= q) {p++; q--} return p > q;in C e altri linguaggi puntatore.
Michael K,

4
Suppongo che mentre un "correttore palindromo" non è particolarmente utile, "scrivere un controllore palindromo" ha almeno uno scopo.
clockworkgeek,

2
Durante un'intervista, mi hanno chiesto di invertire una stringa e mi hanno detto "non ricordare questa stringa. Reverse (). Quindi ho appena convertito la stringa in un array di caratteri e ho fatto Array.Reverse
Jack Marchetti il

Questo è un uso piuttosto di nicchia e non uno che diresti generalmente varrebbe la pena includerlo in lingua / libreria!
Dan Diplo,

8

Interviste!

L'inversione di una stringa (sul posto o meno) è una domanda di intervista molto comune per le conoscenze di base sulla programmazione. Una lingua priva di queste funzioni integrate sarebbe difficile da intervistare. Il candidato dovrebbe effettivamente sapere qualcosa. 1


1: questa è una risposta ironica.


6

Ho visto situazioni in cui un'applicazione desktop parlava con dispositivi incorporati e cambiava costantemente l'endianità dell'ordine dei byte e i dati venivano spostati come stringhe. Questo è tutto per me.

Non avrei usato le stringhe per quell'applicazione ma è andata così .....


+1 per questa risposta. È almeno un esempio pratico, anche se anch'io l'avrei fatto in un altro modo, forse scegliendo tipi primitivi che sono diversamente enddiani.
clockworkgeek,

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

Non è la soluzione migliore per offuscare un indirizzo e-mail, poiché quando lo aggiungi negli Appunti è ancora invertito. E, se fosse diventato popolare, sarebbe presto rilevato dai robot di scraping delle e-mail.

Tuttavia, è stato suggerito .


1
E all'offuscamento più popolare in uso è stata data una sola frase in tutto l'articolo ... Codifica come immagine.
clockworkgeek,

1
@clockworkgeek, potrebbe essere popolare ma IMHO è la peggiore delle soluzioni efficaci - non super facile da generare, non incorporata in HTML (velocità, archiviazione delle immagini, carico del server), sembra fuori posto, non può essere disegnata con CSS e la stessa scarsa esperienza utente dell'inversione di stringa, di doverlo ricordare e digitare nuovamente. E probabilmente più problemi a cui non sto pensando.
Nicole,

Curiosamente, però, usando AT e DOT, il più facile da decodificare per una mietitrice, risulta avere un'efficacia quasi perfetta nella prevenzione della raccolta. A volte mantenerlo semplice non è una cattiva idea.
Joeri Sebrechts,

5

ASCII non è la migliore codifica per le informazioni genetiche (è possibile raggruppare i tipi di base ACGT come 2 bit). Inseriscili in una serie di longlong e otterrai 32 "lettere" genetiche per parola. Il DNA può essere girato, quindi devi controllare un pezzo di DNA contro entrambi i forward sono copie inverse di una sequenza di test. Pertanto, essere in grado di invertire una stringa compressa di quantità di 2 bit può essere molto utile per vari tipi di analisi genetica.

Ho avuto come elemento su un punto di riferimento per le agenzie di spionaggio, quanto velocemente puoi invertire i bit di un lungo-lungo (in realtà una serie molto lunga di lunghi-lunghi). Il metodo ovvio di scambiare 2 bit alla volta è molto più lento dei metodi meno ovvi. Questi sono correlati ad alcuni algoritmi accurati per la trasposizione di array sul posto.

Tangurena: l'operazione a cui ti riferisci si chiama conteggio della popolazione. Desideri simili per i dati a bit pack sono il conteggio zero iniziale e finale. Ci sono molte cose davvero belle che si possono fare con i dati compressi. Una singola operazione su una lunga durata è parallela ai dati a 64 vie, quindi se sai cosa stai facendo puoi ottenere prestazioni incredibili per alcuni tipi di calcoli.


Argomento interessante, come invertiresti un po 'il campo?
clockworkgeek,

"come faresti a invertire un po 'di campo?"
Omega Centauri,

2
Un approccio è la ricerca di tabelle. È possibile invertire un byte utilizzando una tabella. Quindi potresti farlo sui byte individuali. Ci sono anche modi per spostare diversi bit e una volta ... Un po 'di intelligenza e compromessi (dimensioni della tabella rispetto al numero di operazioni ecc.) E puoi provare a sintonizzarlo.
Omega Centauri,

5

Tutto ciò in cui lavorare con la stringa invertita è più semplice.

Lavorare con numeri interi come stringhe è molto più semplice se le stringhe sono invertite. Ho creato alcune funzioni di libreria per fare matematica con numeri interi grandi e ho usato l'inversione di stringa per semplificare le funzioni aritmetiche.

Certo, l'ho usato solo per dare una risposta al Project Euler, ma la premessa originale vale ancora.


+1. quando si usano rappresentazioni di stringhe di numeri, la rappresentazione invertita è molto utile. e di solito la libreria standard rappresenterà i numeri nell'ordine normale.
back2dos

3

Forse supporto multilingue a basso costo, per le lingue che usano le lettere da destra a sinistra (come l'arabo), anziché da sinistra a destra. Ovviamente devi fare attenzione ai caratteri accentati che modificano il carattere giusto ...


2

Non so forse qualcuno ha un ardente bisogno di controllare il palindromo ...

Non penso che sia completamente inutile, in quanto potrebbero esserci situazioni in cui è necessario essere in grado di invertire una stringa.


La domanda successiva a questo sarebbe: quando hai mai avuto bisogno di controllare un palindromo nel mondo reale? Ancora una volta, ho visto solo qualcuno interessarsi alle lezioni di algoritmo.
clockworkgeek,

come questo ad esempio: jimsabo.com/palindrome.html
Darknight

Penso che ci siano probabilmente altri usi, ma è specifico del dominio. Ad esempio, se le ricerche di stringhe sono state ottimizzate per la ricerca in avanti e si desidera eseguire più ricerche per l'ultima occorrenza, è possibile che si desideri invertire prima. Questa sarebbe un'ottimizzazione, e non dovrebbe essere fatta a meno che non ci sia un caso dimostrabile per questo. Potrei immaginare un algoritmo per generare un hash di un valore di stringa che volesse usare l'estremità di coda, possibilmente invertita, se si fosse trattato di fornire migliori caratteristiche di hashing.
Scott Whitlock,

2

Nell'elaborazione e analisi del linguaggio naturale, a volte è più facile cercare una stringa dalla fine all'inizio. Un'inversione di stringa sarebbe utile per il debug o come modo alternativo per scrivere il ciclo (invertire la stringa e quindi scorrere dall'indice 0 a n-1).

Inoltre, alcune lingue sono scritte da destra a sinistra, quindi un inversore di stringa potrebbe essere usato per questo se ti trovassi in un ambiente che non riconosceva in modo nativo le lingue LTR / RTL.

Una stringa (in alcune lingue) è un array di caratteri, ma potrebbe anche essere uno stipendio o una modifica dell'inventario. In un ciclo che si sposta attraverso questi, potresti fare alcuni calcoli che dovrebbero essere gli stessi indipendentemente dall'ordine in cui li elabori. Un test unitario perfettamente cromulento sarebbe quello di verificare se i calcoli si applicano allo stesso modo andando avanti o indietro. Questo potrebbe essere banalmente ovvio per l'aggiunta, forse non per altre operazioni più opache.


1

Per i compilatori?

È divertente, ma la maggior parte dei simboli in una lingua inizierà con uno schema comune. Non sto parlando della notazione ungherese qui, ma se pensi allo spazio dei nomi / alle classi, molti simboli condivideranno effettivamente un prefisso comune .

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

Il problema è che, quando si esegue una ricerca binaria, i prefissi comuni sono la cosa peggiore con cui si può finire, perché alla fine si confronteranno ripetutamente quei prefissi.

D'altra parte, se dai un'occhiata indietro alle corde, vedrai molta più entropia! E poi improvvisamente una ricerca binaria (su un Trie) diventa molto più potente!

Mi ha sempre infastidito il fatto che i nomi alterati in C ++ (da gcc) non siano stati invertiti per mettere lo spazio dei nomi ULTIMO :)


0

Di tanto in tanto capovolgo numeri di telefono e determinate stringhe per le ricerche


0

L'unica volta che ricordo di aver visto l'inversione di stringa utilizzata era una funzione che ho visto da tempo che la utilizzava durante l'analisi dei nomi dei file, per garantire che "." trovato nel nome del file era in effetti l'ultimo punto che separava il nome del file dall'estensione. vale a dire, analizzando un nome di file come data.2010.12.08.dat, invertire la stringa, trovare il primo punto, sottrarre quella posizione dalla fine della stringa originale e prendere la sottostringa. Non sto dicendo che sia il modo ottimale per farlo, ma è quello che ha fatto. Potrebbe essere stato in powerbuilder, dove tali usi strani delle funzioni erano comuni per risolvere vari problemi non ovvi.


0

L'unica vera app worls che ho visto usando lo strrev era quella di archiviare le password degli utenti "illeggibili" nel database ...

Ma ricordo che c'è uno schema in C per usare lo strrev, forse me ne occuperò più tardi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.