Remove Vowels
İngilizce harflerden oluşan bir s dizgesi verilir. İçindeki her sesli harfi silerek elde ettiğin dizgeyi döndür. Sesli harfler, küçük veya büyük harf olarak a, e, i, o ve u harfleridir; burada y sesli harf değildir. Kalan harfler sıralarını ve büyük-küçük harf durumlarını korur.
Fonksiyon
- sstring
- temizlenecek İngilizce harf dizisi
- Döndürürstring
- s'nin tüm ünlüleri çıkarılmış ve diğer harfleri özgün sıralarında korunmuş hâli
Kısıtlar
1 ≤ s.length ≤ 3 × 104syalnızca İngilizce harfleri (ailezarası,AileZarası) içerir.sen az bir ünsüz harf içerir, bu yüzden yanıt hiçbir zaman boş olmaz.
Örnekler
- Girdi
- s = "Interview"
- Çıktı
- "ntrvw"
- Açıklama
InterviewsözcüğündenI,e,iveeharflerini silince, sırasıylan,t,r,v,wkalır. BüyükIde bir ünlüdür, bu yüzden o da gider.
- Girdi
- s = "rhythm"
- Çıktı
- "rhythm"
- Açıklama
rhythmsözcüğündea,e,i,oveyauyoktur, bu yüzden hiçbir şey silinmez. İçindekiyünlüler listesinde değildir ve kalır.
- Girdi
- s = "EuropeanUnion"
- Çıktı
- "rpnnn"
- Açıklama
EuropeanUnionsözcüğündeki on üç harften sekizi, büyükEveUdâhil olmak üzere sesli harftir. Geriye kalan beş sessiz harf,r,p,n,n,n, sıralarını korur verpnnnolarak okunur.
Gönderirken +17 gizli test
Ek soru
Metin, É veya ö gibi herhangi bir Unicode harfini içerebilseydi ne olurdu? Bunlardan hangileri sesli harftir ve testiniz nasıl değişir?
İpuçları
Tek tek açın. Her biri biraz daha fazlasını gösterir.
sharflerinden hangileri yanıtta yer alır ve sıraları değişir mi?Sesli harfleri silmek yerine, tuttuğun harflerden yeni bir dize oluştur.
A,E,I,OveUharflerinin de sesli olduğunu unutma.Dizgeyi bir kez dolaş.
aeiouAEIOUkarakterlerinden biri olmayan her karakteri bir oluşturucuya veya listeye ekle ve sonunda bunları birleştirerek bir dizge oluştur.
Çözüm
Bir dizenin ortasından karakterleri tek tek silmek maliyetlidir, çünkü boşluktan sonraki her şey kayar. Daha iyi yöntem, yanıtı oluşturmaktır: dizenin üzerinden bir kez geç ve sesli harf olmayan her harfi kopyala. Dikkat edilmesi gereken noktalar, büyük harfli sesli harfler ve sonucun nasıl bir araya getirileceğidir.
Her sesli harfi kendi geçişinde silin
Sezgi
Çoğu dil, bir karakterin dizgedeki tüm kopyalarını tek bir çağrıyla silebilir: onu hiçbir şeyle değiştirmeyerek. Bunu a e i o u A E I O U karakterlerinin her biri için bir kez olmak üzere on kez yapın; geriye hiçbir ünlü kalmaz. Ünsüzlere hiç dokunulmaz, bu yüzden sıraları ve büyük-küçük harf durumları korunur.
Interview için e turu Intrviw sonucunu verir, i turu Intrvw sonucunu verir ve I turu ntrvw sonucunu verir. Diğer yedi turda silinecek bir şey bulunmaz.
Her tur geçerli dizgenin tamamını okur, dolayısıyla işlem yaklaşık 10n karakter adımı gerektirir. Bu yine de O(n) olur, çünkü on bir sabittir; ancak 3 × 10^4 harf için bu, tek bir taramanın gerektirdiği 3 × 10^4 adıma karşılık 3 × 10^5 adım demektir.
Algoritma
- On ünlü harfi
aeiouAEIOUbirer birer ele al. - Her biri için,
siçindeki tüm kopyalarını hiçbir şeyle değiştir. - Bu on geçişten sonra
siçinde kalanı döndür.
def removeVowels(s):
for vowel in "aeiouAEIOU":
s = s.replace(vowel, "") # one full pass for this letter
return sÜnsüzleri koruyan tek geçiş
Sezgi
İşi tersine çevir: ünlü harfleri silmek yerine geri kalan her şeyi topla. s üzerinde bir kez dolaş ve her karakter için bunun on ünlü harften biri olup olmadığını kontrol et. Değilse onu sonuca ekle. Okuma sırasına göre eklediğin ve hiçbir karakteri değiştirmediğin için ünsüzlerin sırası ve büyük-küçük harf durumu, girdidekiyle tamamen aynı olur.
EuropeanUnion için dolaşım E, u, o, e, a, U, i ve o harflerini atlar, r, p, n, n, n harflerini ekler: sonuç rpnnn olur.
Her karakter için sabit zamanlı bir kontrol yapılır (küme araması, bir switch veya on harflik bir dizgede arama), dolayısıyla süre O(n) olur. Harfleri bir oluşturucuda veya listede topla ve en sonda bir kez dizgeye dönüştür; değiştirilemez bir dizgeyi += ile büyütmek her adımda kopyalama yapar. Çıktının kendisi O(n) alan kullanır.
Algoritma
- Sonuç için boş bir oluşturucu başlat.
süzerinde her seferinde bir karakter ilerle.- Karakter
aeiouAEIOUiçindeki karakterlerden biri değilse, onu oluşturucuya ekle. - Oluşturucuyu bir dize olarak döndür.
def removeVowels(s):
vowels = set("aeiouAEIOU")
kept = []
for ch in s:
if ch not in vowels:
kept.append(ch)
# Joining a list once avoids rebuilding the string on every character.
return "".join(kept)
Tuzaklar ve uç durumlar
Çoğu yanlış yanıt, ünlü harf kontrolünden veya sonuç dizgesinin nasıl oluşturulduğundan kaynaklanır.
- Büyük ünlü harfleri unutmak. Yalnızca
aeiouharflerini kontrol etmek,InterviewsözcüğününtrvwyerineIntrvwhâline getirir. On harfin tamamını kontrol et veya kontrol etmeden önce karakteri küçük harfe dönüştür ve özgün karakteri çıktıda koru. - Korunan harflerin büyük-küçük harf durumunu değiştirmek. Kontrolü kısaltmak için dizgenin tamamını küçük harfe dönüştürürsen
QUEUEING,QNGyerineqngolarak döner. Yalnızca kontrol ettiğin kopyayı küçük harfe dönüştür ve özgün karakteri ekle. - Dizinde ileri doğru ilerlerken silme yapmak.
s[i]öğesini kaldırmak, sonraki harfiikonumuna kaydırır; ardındani++yaptığında o harfi atlarsın. Böyleceaab,abolarak döner. Yeni bir dizge oluştur veya ayrı okuma ve yazma konumlarıyla ilerle. - Döngüde
+=kullanarak değiştirilemez bir dizgeyi büyütmek. Java veya C#'ta her adım dizgenin tamamını kopyalar;3 × 10^4harf için yaklaşık4.5 × 10^8karakter kopyalanır. Bir oluşturucu veya liste kullanıp bir kez birleştir.
Sıkça sorulan sorular4
Bir dizgeden ünlü harfleri nasıl kaldırırsınız?
Dizgenin üzerinden bir kez geç ve büyük ya da küçük harf olmasına bakmadan a, e, i, o veya u olmayan her harfi bir oluşturucuya ya da listeye kopyala. Sonunda bunları bir dizgede birleştir. Korunan harflerin sırası ve büyük-küçük harf durumu olduğu gibi kalır.
Sesli harfleri kaldırmanın zaman karmaşıklığı nedir?
Tek bir geçiş O(n) zaman alır, çünkü her karakter için sabit zamanlı bir ünlü kontrolü yapılır. En kötü durumda, s hiç ünlü içermediğinde çıktı O(n) alan kullanır. Her ünlü için bir kez replace çağırmak da O(n) zaman alır, ancak dizgeyi on kez okur.
Ünlü harfleri düzenli ifade kullanarak kaldırabilir misin?
Evet. [aeiouAEIOU] desenini boş bir dizeyle değiştirmek, çoğu dilde bunu tek çağrıda yapar. O(n) zamanda çalışır; döngüyle aynı sürede. Ancak mülakatı yapanlar genellikle ünlü harf kontrolünü ve sonucu nasıl oluşturduğunu görebilmeleri için döngüyü yazmanı ister.
Ünlü harfleri neden dizenin içinden yerinde silmiyoruz?
Ortadaki bir karakteri silmek, sonraki tüm karakterleri sola kaydırır; bu nedenle çok sayıda silme işlemi O(n²) maliyetine yol açabilir. Bunu, her karakteri okuyan bir indeks ve sıradaki korunacak harfi yazan bir indeks kullanarak O(n) zamanda yerinde yapabilirsin; ancak çoğu dilde dizeler değiştirilemediğinden, yeni bir dize oluşturmak doğal bir çözümdür.
Benzer problemler
Aynı fikirleri kullanan problemler. İki üçünü çözmek bir kalıbı kalıcı hale getirir.
Python
def removeVowels(s):
# Kodu buraya yazınDurum 1
Durum 2
Durum 3
Girdi
s = "Interview"
Beklenen
"ntrvw"