W PHP jest strrev()
, w Railsach .reverse
, ale większość języków nie ma funkcji odwracania łańcucha. Niektóre mają funkcje odwracania tablic, których można używać na znakach. Myślałem, że to musi być poważny niedopatrzenie, ale potem przyszło mi do głowy, do czego właściwie użyłbyś odwrotności łańcucha?
Mogę tylko myśleć, że widziałem to podczas pokazów i lekcji, aby zmienić „Hello World!” w „! dlroW olleH”.
Moje pytanie brzmi; Czy można cofnąć ciąg znaków, czy jest to całkowicie bezcelowe?
.
Uzupełnienie
Było znacznie więcej odpowiedzi, niż się spodziewałem i nie wszystkie były całkowicie akademickie. Odłożyłbym pieniądze, których nikt nie mógłby podać uzasadnionego przykładu. Nie sądziłem też, że nauczę się czegoś nowego, ale sugestia wyrażenia regularnego Marka Canlasa jest po prostu genialna i nie mogę się doczekać, aż się to sprawdzi. Dziękuje za wszystko.
źródło
a ^= b; b ^= a; a ^= b;
Odpowiedzi:
Sexegers
Czasami problemy z wyrażeniami regularnymi można łatwiej napisać, odwracając łańcuch wejściowy i rozwiązując problem w inny sposób.
Technika dzięki uprzejmości człowieka, który nauczył mnie Perla.
Sexeger na PerlMonks
źródło
Cóż, to jest odpowiedź na język.
„Back in the day” Posiadałem pudełko uniksowe i miałem uporządkowany plik słownika angielskich słów, używany do sprawdzania pisowni.
Utworzyłem nowy plik, odwracając wszystkie słowa ze słownika, sortując je, a następnie odwracając. Rezultatem była lista słów posortowanych od prawej do lewej.
Więc jeśli szukałeś słowa, obok tego słowa byłyby słowa o podobnych zakończeniach. Łatwo było więc tworzyć małe wiersze!
Możesz naprawdę się zabawić, kiedy zobaczysz, co rymuje się z czym.
źródło
Jestem programistą / programistą / sysadminem od około 10 lat i nie pamiętam, aby kiedykolwiek potrzebowałem odwrócenia łańcucha w rzeczywistych sytuacjach.
Jedynym bezpośrednim przypadkiem użycia, o którym mogę myśleć, jest konwersja bazy liczbowej: naiwnie wykonana procedura zwraca ciąg odwrócony. Jednak przy odrobinie matematyki możesz z góry obliczyć potrzebną ilość miejsca, dzięki czemu możesz zacząć wypełniać bufor od końca.
źródło
memmove
do początku po zakończeniu. Prawdopodobnie jest to tańsze niż obliczanie log (n) / log (base) do obliczenia niezbędnej liczby cyfr.źródło
0
celun/2
i porównać znak na końcu przeciwnym.while ( (*p == *q) && (p <= q) {p++; q--} return p > q;
w C i innych językach wskaźnikowych.Wywiady
Odwracanie łańcucha (na miejscu lub nie) jest bardzo częstym pytaniem w wywiadach dla podstawowej wiedzy programistycznej. Trudno byłoby przeprowadzić wywiad z językiem pozbawionym tych wbudowanych funkcji. Kandydat musiałby coś wiedzieć. 1
1: To jest odpowiedź na język.
źródło
Widziałem sytuacje, w których aplikacja komputerowa rozmawiała z urządzeniami wbudowanymi i ciągle zmieniała endianność kolejności bajtów, a dane były przenoszone jako ciągi znaków. To tyle dla mnie.
Nie użyłbym ciągów dla tej aplikacji, ale tak właśnie było .....
źródło
Nie jest to najlepsze rozwiązanie do zaciemniania adresu e-mail, ponieważ po dodaniu go do schowka jest on nadal odwracany. A jeśli stanie się popularny, wkrótce zostanie wykryty przez roboty zbierające wiadomości e-mail.
Mimo to zostało zasugerowane .
źródło
ASCII nie jest najlepszym kodowaniem informacji genetycznej (typy podstawowe ACGT można spakować jako 2 bity). Spakuj je do szeregu długich liter, a otrzymasz 32 genetyczne „litery” na słowo. DNA można odwrócić, więc musisz sprawdzić, czy fragment DNA w obu kierunkach to odwrotne kopie sekwencji testowej. Możliwość odwrócenia upakowanego ciągu 2-bitowych ilości może być bardzo przydatna do różnego rodzaju analiz genetycznych.
Miałem jako punkt odniesienia dla agencji szpiegowskich, jak szybko można odwrócić bity na bardzo długo (właściwie bardzo długi szereg długich i długich). Oczywista metoda wymiany 2 bitów jednocześnie jest znacznie wolniejsza niż mniej oczywiste metody. Są one związane z niektórymi zgrabnymi algorytmami transpozycji macierzy na miejscu.
Tangurena: Operacja, o której mówisz, nazywa się liczbą ludności. Podobne wartości pożądane dla danych spakowanych bitowo to wiodąca i końcowa liczba zerowa. Istnieje wiele naprawdę fajnych rzeczy, które można zrobić z nieco spakowanymi danymi. Pojedyncza operacja na długim połączeniu jest równoległa do 64-kanałowej transmisji danych, więc jeśli wiesz, co robisz, możesz uzyskać niesamowitą wydajność w przypadku niektórych rodzajów obliczeń.
źródło
Wszystko, gdzie praca z odwróconym łańcuchem jest łatwiejsza.
Praca z liczbami całkowitymi jako ciągami jest znacznie łatwiejsza, jeśli ciągi są odwrócone. Zbudowałem kilka funkcji bibliotecznych do wykonywania obliczeń matematycznych z dużymi liczbami całkowitymi i użyłem odwrócenia łańcucha, aby uprościć funkcje arytmetyczne.
To prawda, że użyłem go tylko do wykreślenia odpowiedzi na temat Project Euler, ale pierwotna przesłanka jest nadal aktualna.
źródło
Być może niedrogie wielojęzyczne wsparcie dla języków używających liter od prawej do lewej (takich jak arabski) zamiast od lewej do prawej. Oczywiście musisz uważać na znaki akcentujące modyfikujące właściwy znak ...
źródło
Nie wiem, może ktoś ma palącą potrzebę sprawdzenia palindromu ...
Nie uważam tego za całkowicie bezużyteczne, ponieważ mogą zdarzyć się sytuacje, w których trzeba być w stanie odwrócić łańcuch.
źródło
W przetwarzaniu i parsowaniu języka naturalnego czasem łatwiej jest wyszukać ciąg od końca do początku. Odwrócenie łańcucha byłoby przydatne do debugowania lub jako alternatywny sposób zapisania pętli (odwróć ciąg, a następnie zapętl indeks od 0 do n-1).
Również niektóre języki są pisane od prawej do lewej, więc można do tego użyć odwrócenia łańcucha, jeśli znajdujesz się w środowisku, które nie rozpoznaje natywnie języków LTR / RTL.
Ciąg (w niektórych językach) to tablica znaków, ale równie dobrze mogą to być wypłaty lub modyfikacje ekwipunku. W pętli poruszającej się po nich możesz wykonać pewne obliczenia, które powinny być takie same, niezależnie od kolejności ich przetwarzania. Idealnie cromulentny test jednostkowy polegałby na sprawdzeniu, czy obliczenia dotyczą tego samego w przód czy w tył. Może to być trywialnie oczywiste w przypadku dodawania, może nie w przypadku innych bardziej nieprzejrzystych operacji.
źródło
Dla kompilatorów?
To zabawne, ale większość symboli w języku zaczyna się od wspólnego wzorca. Nie mówię tu o notacji węgierskiej, ale jeśli pomyślisz o przestrzeni nazw / klasach, wtedy wiele symboli będzie miało wspólny przedrostek .
Problem polega na tym, że podczas wyszukiwania binarnego najczęstsze prefiksy są najgorszą rzeczą, z jaką możesz się skończyć, ponieważ będziesz porównywał te prefiksy w kółko.
Z drugiej strony, jeśli spojrzysz na struny do tyłu, zobaczysz znacznie więcej entropii! A potem nagle wyszukiwanie binarne (za pomocą Trie) staje się znacznie potężniejsze!
Zawsze denerwowało mnie to, że zniekształcone nazwy C ++ (wg gcc) nie zostały odwrócone, aby pozostawić przestrzeń nazw OSTATNĄ :)
źródło
Od czasu do czasu przerzucam numery telefonów i określone ciągi wyszukiwania
źródło
Jedyny raz, kiedy pamiętam, że użyłem odwrócenia łańcucha, była funkcja, którą widziałem wstecz, która używała go podczas analizowania nazw plików, aby upewnić się, że „.” znaleziona w nazwie pliku była w rzeczywistości ostatnią kropką oddzielającą nazwę pliku od rozszerzenia. tzn. parsując nazwę pliku, taką jak
data.2010.12.08.dat
, odwrócisz ciąg, znajdziesz pierwszą kropkę, odejmiesz tę pozycję od końca oryginalnego ciągu i weź podciąg. Nie twierdzę, że to optymalny sposób na zrobienie tego, ale tak właśnie się stało. Być może miało to miejsce w kreatorze zasilania, gdzie takie dziwne użycie funkcji było często stosowane w celu obejścia różnych nieoczywistych problemów.źródło
Jedyną prawdziwą aplikacją dla worlów, którą widziałem za pomocą strrev, było przechowywanie haseł użytkownika „nieczytelnych” w bazie danych ...
Ale pamiętam, że w C jest wzorzec do używania strrev, może wymyślę go później.
źródło