To Lower Case
Sana bir s dizgesi verilir. Her büyük İngilizce harfin, A ile Z arasındaki harflerin, küçük harfiyle değiştirildiği yeni bir dizge döndür. Küçük harf, rakam veya sembol gibi diğer tüm karakterler olduğu gibi kalır.
Fonksiyon
- sstring
- dönüştürülecek metin
- Döndürürstring
- s, her büyük harfi küçük harfe çevrilmiş
Kısıtlar
1 ≤ s.length ≤ 104-
s'nin her karakteri bir İngilizce harf, rakam veya şu sembollerden biridir:!#$%&()*+-./:;<=>?@[]^_`{|}~.
Örnekler
- Girdi
- s = "Hello-World!"
- Çıktı
- "hello-world!"
- Açıklama
- Büyük harfli
HveW,hvewolur.-ve!harf değildir, bu yüzden yerlerinde kalırlar.
- Girdi
- s = "coddy_2026"
- Çıktı
- "coddy_2026"
- Açıklama
- Değiştirilecek büyük harf yok. Küçük harfler,
_ve rakamlar değişmeden geri döner.
- Girdi
- s = "SQL"
- Çıktı
- "sql"
- Açıklama
- Üç karakterin de tümü büyük harftir, bu nedenle her biri küçük harf karşılığına dönüşür.
Gönderirken +15 gizli test
Ek soru
Karakter kodunun yalnızca bir bitinin A ile a arasında neden farklı olduğunu açıklayıp aynı döngüyle toUpperCase yazabilir misin?
İpuçları
Tek tek açın. Her biri biraz daha fazlasını gösterir.
Bir bilgisayar her karakteri bir sayı olarak saklar.
Aveaiçin kullanılan sayılar arasındaki ilişki nedir?AileZarasındaki harflerin kodları 65 ile 90,ailezarasındaki harflerin kodları ise 97 ile 122'dir. Her büyük harfin kodu, küçük harfin kodundan tam olarak 32 eksiktir.Karakterleri teker teker inceleyin. Bir karakterin kodu 65 ile 90 arasındaysa 32 ekleyin; aksi hâlde karakteri olduğu gibi bırakın. Sonuçları toplayıp yanıtı oluşturmak için birleştirin.
Çözüm
Her dilde küçük harfe dönüştürme işlevi bulunur ve üretim kodunda bunu çağırmalısınız. Mülakat yapanlar, bu işlevin ne yaptığını bilip bilmediğinizi görmek için bu problemi sorar: karakter bir sayıdır ve ASCII'de her büyük harf, küçük harfinden tam olarak 32 kod aşağıda yer alır. Kodun 'A' ile 'Z' arasında olup olmadığını kontrol edin ve öyleyse 32 ekleyin.
Küçük harfe dönüştürme yerleşik işlevini çağırın
Sezgi
Python'daki lower(), JavaScript'teki toLowerCase(), Ruby'deki downcase ve diğer dillerdeki benzerleri bu işi zaten yapar. C ve C++, tek bir karakter için tolower sunar; bu nedenle bunu bir döngüde çağırırsınız. Her karaktere bir kez bakılır, dolayısıyla işlem O(n) sürer ve yeni dizge O(n) alan kaplar.
Bu işlevlerden bazıları makinenin dil ayarlarını izler. Türkçede I harfinin küçüğü, i değil, noktasız ı harfidir. Java ve C# sürümlerinin Locale.ROOT ve ToLowerInvariant ile sabit bir kural istemesinin nedeni budur; böylece sonuç bir bilgisayardan diğerine değişmez.
İş ortamında doğru yanıt budur. Bir mülakatta ise sorunun asıl olarak ölçtüğü fikri gizlediği için bu yanıt genellikle kabul edilmez.
Algoritma
- Dilinizin küçük harfe dönüştürme işlevini
süzerinde çağırın veya C ve C++'ta her karakter içintolowerçağırın. - İşlevin sunduğu durumlarda sabit, dilden bağımsız bir kural isteyin.
- Sonucu döndürün.
def toLowerCase(s):
return s.lower()Büyük harflerin karakter kodlarını kaydırın
Sezgi
Her karakter bir sayı olarak saklanır. ASCII'de A ile Z arasındaki harflerin kodları 65 ile 90, a ile z arasındaki harflerin kodları ise 97 ile 122'dir. Her iki aralık da alfabetik sıradadır ve aralarında 32 fark vardır; bu nedenle herhangi bir büyük harfin küçük harfi, koduna 32 eklenerek elde edilir: H 72, h ise 104'tür.
Bu yüzden dizgeyi bir kez dolaş. Bir kod 65 ile 90 arasındaysa 32 ekle; değilse karakteri olduğu gibi kopyala. Aralık kontrolü önemlidir: [, ^ ve _ sembolleri Z ile a arasında, @ ise A'dan hemen önce yer alır. Yalnızca code < 97 koşulunu sınamak, _ sembolünü farklı bir sembole dönüştürürdü.
Her karakter bir kez kontrol edilir; bu da O(n) zaman demektir. Yanıt, aynı uzunlukta yeni bir dizgedir; yani O(n) alan kullanır. 32 yerine 'a' - 'A' yazmak aynı şeyi ifade eder ve bu sayının nereden geldiğini açıklar.
Algoritma
s'yi karakterlerden veya kodlardan oluşan bir diziye kopyala.- Her konumda karakter kodunu oku.
- Kod
'A'(65) ile'Z'(90) arasındaysa 32 ekle. - Diziyi tekrar bir dizgeye dönüştür ve döndür.
def toLowerCase(s):
# Every capital letter sits 32 codes below its small letter: 'A' is 65, 'a' is 97.
shift = ord("a") - ord("A")
chars = []
for ch in s:
if "A" <= ch <= "Z":
ch = chr(ord(ch) + shift)
chars.append(ch)
return "".join(chars)
Tuzaklar ve uç durumlar
Döngü kısa, bu yüzden hatalar aralık denetiminde ve sonucun nasıl oluşturulduğunda.
- Küçük harf olmayan her karaktere 32 eklemek. Rakamlar ve semboller de değişir:
1,Qolurdu. - Aralığın yalnızca bir ucunu denetlemek.
code < 'a',[,_ve@karakterlerini de kapsar;code >= 'A'ise tüm küçük harfleri de kapsar. - Uçlarda
<=yerine<kullanmak; bu,AveyaZharflerini büyük harf olarak bırakır. - Değiştirilemez bir dizgede
result = result + chile sonucu oluşturmak. Her adım o ana kadarki her şeyi kopyalar; bu dan = 10^4için karesel zamanlıdır. - C'de girdinin üzerine yazmak veya sonlandırıcı
'\0'karakterini unutmak. Kopya içinn + 1bayt ayırın.
Sıkça sorulan sorular4
Yerleşik bir işlev kullanmadan bir metni nasıl küçük harfe dönüştürürsünüz?
Karakterlerin üzerinden döngüyle geç ve her karakter koduna bak. Kod 65 (A) ile 90 (Z) arasındaysa, küçük harfi elde etmek için 32 ekle; diğer tüm karakterleri olduğu gibi bırak. Karakterleri yeniden birleştirerek bir dizge oluştur.
Büyük harf ile küçük harf arasındaki fark neden 32?
ASCII, büyük harfleri 65 ile 90 arasındaki kodlara, küçük harfleri ise 97 ile 122 arasındaki kodlara yerleştirir; aralarında altı sembol bulunur. Her iki alfabe de aynı sıradadır, bu nedenle her harf çifti arasında 97 - 65 = 32 fark vardır. 32 tek bir bittir; bu biti ayarlamak, büyük harfi küçük harfe dönüştürür.
Büyük/küçük harf durumunu bir bit işlemiyle değiştirebilir misin?
Evet. Büyük harf için code | 32 iki durumu ayıran biti ayarlayarak küçük harfi verir; code & ~32 ise bu biti yeniden temizler. Yine de önce aralık kontrolü yapmanız gerekir, çünkü aynı bit hilesi rakamları ve sembolleri de değiştirir.
Bir dizgeyi küçük harfe dönüştürmenin zaman karmaşıklığı nedir?
Uzunluğu n olan bir dize için O(n) sürer, çünkü her karakter bir kez kontrol edilir. Yeni dize O(n) alan kaplar. Bir karakter dizisini yerinde değiştirebilirseniz, ek alan O(1) olur.
Benzer problemler
Aynı fikirleri kullanan problemler. İki üçünü çözmek bir kalıbı kalıcı hale getirir.
Python
def toLowerCase(s):
# Kodu buraya yazınDurum 1
Durum 2
Durum 3
Girdi
s = "Hello-World!"
Beklenen
"hello-world!"