Dize tersini ne için kullanıyorsunuz? [kapalı]


15

PHP'de strrev(), Rails'te .reverse, ancak çoğu dilde ters dize işlevi yoktur. Bazılarında karakterlerde kullanılabilen dizi ters işlevleri vardır. Bu büyük bir gözetim olması gerektiğini düşünüyordum ama sonra bana, ne dize ters için kullanırdım ???

Bunu gördüğümü düşünebildiğim tek zaman demo ve derslerde "Merhaba Dünya!" "! dlroW olleH" içine.

Sorum şu; Bir dizeyi tersine çevirmenin bir kullanımı var mı yoksa tamamen anlamsız mı?

.

ek

Beklediğimden daha fazla cevap geldi ve hepsi tamamen akademik değildi. Hiç kimsenin meşru bir örnek bulamayacağına para koyardım. Ayrıca yeni bir şey öğreneceğimi düşünmedim, ancak Mark Canlas'ın normal ifadesi sadece harika ve kendini kanıtlama fırsatını dört gözle bekliyorum. Herkese teşekkürler.


@clockworkgeek - bir adaydan en sevdiği dilde dize tersine çevirmesini isterseniz, kaç kişinin bahsettiğiniz temel işlevle gelmediğine şaşıracaksınız. O zaman kaç kişi bunu uygulamak için bir döngü bulamaz.
justkt

@justkt - Bu, gerçekleşmeyi bekleyen başka bir soru, ancak bunun yerine TopCoder için bir konu olabilir.
clockworkgeek

6
Sürüş sırasında dikiz aynasından okunabilecek bir metin mesajı göndermek için polisler fark etmeyecektir.
JeffO

@justkt - Bunu yapmak için yinelemeli bir döngü yazmak zorunda kalsaydım, orta noktaya ulaşılana kadar karakterleri takas etmek için zıt uçlardan başlardım. Ama sonra iki değeri nasıl değiştirirsiniz? İşte şimdiye kadar verilen en iyi cevap:a ^= b; b ^= a; a ^= b;
clockworkgeek

1
i dizeleri tersine çevirmek için dize ters kullanın;)
Muad'Dib

Yanıtlar:


19

Sexegers

Bazen, düzenli ifadeleri içeren problemler, giriş dizesinin ters çevrilmesi ve sorunun farklı bir şekilde ele alınmasıyla daha kolay yazılabilir.

Bana Perl'i öğreten adamın tekniği sayesinde.

PerlMonks üzerinde Sexeger


Teşekkür ederim. Bir şeyin sonunu bulmak için çok kullanışlı bir numara. Tam olarak not edildi.
clockworkgeek

Bunu yıllardır yapıyorum. E-posta adreslerini ayrıştırmaya yardımcı olur.
sal

23

Bu yanaktaki bir cevap.

"Güne geri döndüm" Bir Unix kutusuna sahiptim ve yazım denetimi için kullanılan İngilizce kelimelerin sıralı bir sözlük dosyasına sahiptim.

Sözlükteki tüm kelimeleri ters çevirerek, sıralayarak ve sonra tekrar ters çevirerek yeni bir dosya oluşturdum. Sonuç, sağdan sola doğru sıralanan kelimelerin listesiydi.

Eğer bir kelimeyi aradıysanız, o kelimenin yanında benzer sonlara sahip kelimeler olacaktır. Bu yüzden küçük şiirler yapmak kolaydı!

Neyin neyle kafiyeli olduğunu gördüğünüzde kendinizi gerçekten eğlendirebilirsiniz.


13

Ben ~ 10 yıl boyunca bir kodlayıcı / geliştirici / sistem yöneticisi olmuştur ve hatırlayamıyorum hiç gerçek hayatta dize tersine gerek.

Düşünebildiğim tek anında kullanım durumu sayı tabanı dönüşümdür: saf olarak yapılır, işlem ters bir dize döndürür. Bununla birlikte, biraz matematikle, gerekli alan miktarını önceden hesaplayabilirsiniz, böylece arabelleği sondan doldurmaya başlayabilirsiniz.


1
Matematiğin dizeyi tersine çevirmekten daha pahalı olması mümkündür, bu nedenle platformunuzda (ARM, MIPS, x86) kıyaslama yaptıktan sonra tersine bir dize kullanabilirsiniz. Olabilir.
Zan Lynx

Tamponu sondan doldurabilir ve memmovebittiğinde başlangıç için a kullanabilirsiniz . Muhtemelen gereken basamak sayısını hesaplamak için log (n) / log (base) hesaplamaktan daha ucuzdur.
Patrick Schlüter

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

1
Evet - aslında adayların bir palindrom denetleyicisi yazdığı ve çoğunun bunu yaptığı bir röportaj taramamız var. Ancak, ben daha iyi adaylar arasından yineleme zaman gibi 0etmek n/2ve karşı uçta karakteri karşılaştırın.
Nicole

@Renesis: Şunları da yapabilirsiniz: dizenin p başlangıcını, q dizenin sonunu, while ( (*p == *q) && (p <= q) {p++; q--} return p > q;C ve diğer işaretçi dillerinde ayarlayın.
Michael K

4
Bir "palindrome denetleyicisi" özellikle yararlı olmasa da, "bir palindrome denetleyicisi yazmak" en azından bir amacı var sanırım.
clockworkgeek

2
Bir görüşmede Array.Reverse, onlar bir dize ters istedi ve bu hiç string.Rverse () Yani sadece bir karakter dizisine dize dönüştürülür hatırla" dedi ve yaptı.
Jack Marchetti

Bu oldukça niş bir kullanımdır ve genellikle söyleyeceğiniz bir dil / kütüphaneye dahil olmaya değmez!
Dan Diplo

8

Görüşmeler!

Bir dizgiyi ters çevirmek (yerinde ya da değil), temel programlama bilgisi için çok yaygın bir görüşme sorusudur. Bu yerleşik işlevlerden yoksun bir dil için röportaj yapmak zor olacaktır. Adayın aslında bir şey bilmesi gerekecekti. 1


1: Bu bir yanak dilidir.


6

Bir masaüstü uygulamasının gömülü cihazlarla konuştuğu ve bayt sırası endianitesini sürekli değiştirdiği ve verilerin dizeler olarak taşındığı durumlar gördüm. Benim için bu kadar.

Bu uygulama için dizeleri kullanmazdım ama thats sadece olduğu gibi .....


Bu cevap için +1. En azından pratik bir örnek olsa da, belki de farklı enddian ilkel türleri seçerek başka bir şekilde yapardım.
clockworkgeek

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

Bir e-posta adresini gizlemek için en iyi çözüm değil, çünkü panoya eklediğinizde hala ters. Ve eğer popüler hale gelirse, yakında e-posta kazıma botları tarafından tespit edilecekti.

Yine de önerildi .


1
Ve kullanımdaki en popüler şaşkınlığa tüm makalede sadece tek bir cümle verildi ... Bir görüntü olarak kodlama.
clockworkgeek

1
@clockworkgeek, popüler bir çözüm olabilir, ancak IMHO etkili çözümlerin en kötüsüdür - üretilmesi çok kolay değil , HTML'ye gömülmemiş (hız, görüntülerin depolanması, sunucu yükü), yerinden görünüyor, tarz oluşturulamıyor CSS ve dize tersine çevirme ile aynı kötü kullanıcı deneyimi, hatırlamak ve yeniden yazmak zorunda kalıyor. Ve muhtemelen daha fazla problem düşünmüyorum.
Nicole

Merakla, bir biçerdöver için kod çözmenin en kolay olan AT ve DOT'un kullanılması, hasadın önlenmesinde neredeyse mükemmel bir etkinliğe sahip olduğu ortaya çıkıyor. Bazen basit tutmak o kadar da kötü bir fikir değildir.
Joeri Sebrechts

5

ASCII genetik bilgi için en iyi kodlama değildir (ACGT temel tiplerini 2 bit olarak paketleyebilirsiniz). Bunları uzunlamasına bir dizi halinde toplayın ve kelime başına 32 genetik "harf" elde edin. DNA tersine çevrilebilir, bu yüzden bir DNA dizisinin her iki ileriye karşı bir test dizisinin ters kopyaları olduğunu kontrol etmeniz gerekir. Dolayısıyla, 2 bit miktarında paketlenmiş bir dizeyi tersine çevirmek, çeşitli genetik analizler için çok yararlı olabilir.

Ben casus ajansları için bir ölçüt üzerinde bir öğe vardı, ne kadar hızlı bitleri uzun bir süre (aslında çok uzun bir dizi uzun-uzun) ters. Bir seferde 2 bit değişimi için bariz yöntem, daha az belirgin yöntemlerden çok daha yavaştır. Bunlar, yerinde dizi transpozisyonu için bazı düzgün algoritmalarla ilgilidir.

Tangurena: Söz ettiğiniz işleme nüfus sayımı denir. Bit dolgulu veriler için benzer arzular öncüdür ve sıfır sayısını izler. Biraz paketlenmiş verilerle yapabileceğiniz çok temiz şeyler var. Uzun bir süre boyunca tek bir işlem 64 yollu veri paralelidir, bu nedenle ne yaptığınızı biliyorsanız belirli hesaplama türleri için inanılmaz performans elde edebilirsiniz.


İlginç bir konu, biraz alanı nasıl tersine çevirirsiniz?
clockworkgeek

"Biraz alanı nasıl tersine çevirirsiniz?"
Omega Centauri

2
Bir yaklaşım tablo aramasıdır.Bir tablo kullanarak bir baytı tersine çevirebilirsiniz. Böylece bunu bireysel baytlarda yapabilirsiniz. Ayrıca birkaç bit ve bir kez hareket etmenin yolları da vardır ... Biraz zekice ve dengesizlikler (tablo boyutuna karşı işlem sayısı vb.) Ve onu ayarlamaya çalışabilirsiniz.
Omega Centauri

5

Ters dize ile çalışmanın daha kolay olduğu her şey.

Dizeler ters çevrilirse tamsayılarla dize olarak çalışmak çok daha kolaydır. Büyük tamsayılarla matematik yapmak için bazı kütüphane fonksiyonları oluşturdum ve aritmetik fonksiyonları basitleştirmek için dize tersini kullandım.

Kabul ettim, sadece Project Euler ile ilgili cevaplar vermek için kullandım, ama yine de orijinal öncül var.


+1. sayıların dize temsillerini kullanırken, ters temsili çok yararlıdır. ve genellikle standart kütüphane sayıları normal sırada temsil eder.
back2dos

3

Belki soldan sağa yerine sağdan sola (Arapça gibi) harfler kullanan diller için düşük maliyetli çok dilli destek. Tabii ki doğru karakteri değiştiren aksan karakterlerine dikkat etmelisiniz ...


2

Belki birisi palindrome kontrol etmek için yanan bir ihtiyacı var bilmiyorum ....

Bir ipi tersine çevirebilmesi gereken durumlar olabileceğinden, tamamen işe yaramaz olduğunu düşünmüyorum.


Bunu takip eden soru, gerçek dünyada bir palindromu ne zaman kontrol etmeniz gerektiğidir? Yine, sadece algoritma derslerine önem veren birini gördüm.
clockworkgeek

bunun gibi bir örnek: jimsabo.com/palindrome.html
Darknight

Sanırım muhtemelen başka kullanımlar var, ancak etki alanına özgü. Örneğin, dize aramaları ileri arama için optimize edilmişse ve son gerçekleşme için birden çok arama yapmak istiyorsanız, önce geri çevirmek isteyebilirsiniz. Bu bir optimizasyon olurdu ve bunun kanıtlanabilir bir durumu olmadığı sürece yapılmamalıdır. Daha iyi hash özellikleri sağladıysa, muhtemelen tersine çevrilmiş, kuyruk ucunu kullanmak isteyen bir dize değerinin bir karmasını oluşturmak için bir algoritma tasarlayabilirim.
Scott Whitlock

2

Doğal dil işleme ve ayrıştırmada, bazen bir dizeyi baştan sona aramak daha kolaydır. Bir dize tersi, hata ayıklama için veya döngüyü yazmak için alternatif bir yol olarak (dizeyi tersine çevirin ve sonra dizin 0'dan n-1'e döngü) yararlı olacaktır.

Ayrıca bazı diller sağdan sola yazılır, bu nedenle yerel olarak LTR / RTL dillerini tanımayan bir ortamda olsaydınız bir dize ters çevirici kullanılabilir.

Bir dize (bazı dillerde) bir dizi karakterdir, ancak maaş çekleri veya envanter değişiklikleri de olabilir. Bunlar arasında hareket eden bir döngüde, bunları hangi sırada işlediğinizden bağımsız olarak aynı olması gereken bazı hesaplamalar yapabilirsiniz. Mükemmel bir kromatik birim testi, hesaplamaların aynı ileri veya geri gidip gitmediğini kontrol etmek olacaktır. Bu, ekleme için önemsiz bir şekilde açık olabilir, belki daha opak işlemler için olmayabilir.


1

Derleyiciler için mi?

Eğlenceli, ancak bir dildeki sembollerin çoğu ortak bir kalıpla başlayacaktır. Burada Macarca Gösterim'den bahsetmiyorum, ancak ad alanı / sınıflar hakkında düşünürseniz, o zaman birçok sembol aslında ortak bir önek paylaşacak .

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

Sorun, bir ikili arama yaparken, ortak öneklerle karşılaşabileceğiniz en kötü şeydir, çünkü bu önekleri tekrar tekrar karşılaştırırsınız.

Öte yandan, dizeleri geriye doğru bakarsanız, çok daha entropi görürsünüz! Ve sonra aniden bir ikili arama (bir Trie üzerinde) çok daha güçlü hale gelir!

Her zaman C ++ ile karıştırılan adların (gcc ile) LAST ad alanını koymak için tersine çevrilmediğini sıktım :)


0

Zaman zaman arama yapmak için telefon numaralarını ve belirli dizeleri çeviriyorum


0

Kullanılan dize tersini görmeyi hatırlayabildiğim tek zaman, dosya adlarını ayrıştırırken kullanılan '.' dosya adında bulunan dosya aslında dosya adını uzantıdan ayıran son noktaydı. örneğin, data.2010.12.08.datdizeyi ters çevirir, ilk noktayı bulursunuz, bu konumu orijinal dizenin sonundan çıkarır ve alt dizeyi alırsınız gibi bir dosya adını ayrıştırırsınız . Bunu yapmanın en iyi yolu değil, ama ne yaptığını söylemiyorum. Bu tür garip işlevlerin çeşitli açık olmayan problemleri çözmek için yaygın olduğu güç üreticisinde olabilir.


0

Ben strrev kullanarak gördüğüm tek gerçek worls uygulaması veritabanında 'okunamaz' kullanıcı şifreleri saklamak oldu ...

Ama C'de strrev'i kullanmak için bir desen olduğunu hatırlıyorum, belki daha sonra ortaya çıkarım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.