Leetcode, Roman to Integer Problemi Çözümü (Kotlin)
Soruda, verilen stringdeki Romen rakamlarından oluşan sayının Integer'a dönüştürülmesi isteniyor.
Romen Rakamları:
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
Kotlin'de bu Romen rakamlarını karşılıkları ile tutabileceğimiz yapı Map koleksiyonu. Bu yüzden önce onu oluşturdum.
class Solution {
fun romanToInt(s: String): Int {
var sum: Int = 0
val romanToInt: Map<Char, Int> = mapOf('M' to 1000, 'D' to 500, 'C' to 100, 'L' to 50, 'X' to 10,'V' to 5, 'I' to 1)
Romen sayılarında 1 (I), 10 (X) veya 100 (C)'ün bir sağında kendisinden büyük bir sayı var ise o büyük sayıdan çıkartılıyor(lar). Yani örnek olarak şöyle:
IV = 4
XL = 40
Böyle bir istisna olmasa Romen rakamlarını iterate edip her birinin karşılığını toplama ekleyebilirdik. Buna da şöyle çözüm buldum: Döngü ile verilen stringin karakterlerini iterate ederken mevcut karakter I, X veya C ise kendisinden bir sonraki elemanı da kontrol edeyim.
- Eğer sonraki eleman büyükse o elemandan çıkararak toplam değişkenine ekleyeyim.
- Büyük değilse veya zaten mevcut karakter o 3 karakterden biri değilse sadece mevcut elemanı toplam değişkenine ekleyeyim.
Kodda daha iyi anlaşılır:
class Solution {
fun romanToInt(s: String): Int {
var sum: Int = 0 // TOPLAM
val romanToInt: Map<Char, Int> = mapOf('M' to 1000, 'D' to 500, 'C' to 100, 'L' to 50, 'X' to 10,'V' to 5, 'I' to 1)
for (i in s.indices){
if(i<s.length-1 && (s[i] == 'C' || s[i] == 'X' || s[i] == 'I')){ //3 Romen rakamından biriyse:
if(romanToInt.get(s[i])!! < romanToInt.get(s[i+1])!!){ //Geçerli eleman, bir sonraki elemendan küçükse...
sum += romanToInt.get(s[i+1])!! - romanToInt.get(s[i])!!
}else{ //Geçerli eleman, bir sonraki elemandan küçük değilse sadece geçerli eleman sum'a ekleniyor.
sum += romanToInt.get(s[i])!!
}
}else{ //3 Romen rakamından biri değilse direkt geçerli eleman sum'a ekleniyor.
sum += romanToInt.get(s[i])!!
}
}
return sum
}
}
Daha malesef bitmedi. Şimdi şöyle bir sorun var. Verilen sayıda I, X veya C karakterlerinden sonraki karakter daha büyük olduğunda gereken işlemi yapıyoruz. Yani o bir sonraki karakterle işimiz aslında bitiyor. Fakat döngü birer birer atladığı için o işimizin kalmadığı bir sonraki indeksin es geçilmesi gerekiyor. Buna da şöyle bir çözüm buldum:
class Solution {
fun romanToInt(s: String): Int {
var sum: Int = 0 // TOPLAM
val romanToInt: Map<Char, Int> = mapOf('M' to 1000, 'D' to 500, 'C' to 100, 'L' to 50, 'X' to 10,'V' to 5, 'I' to 1)
var continueLoop: Boolean = false
for (i in s.indices){
if(continueLoop){ //Başa bu kontrolü ekledim ki continueLoop true yapıldığında döngü 1 sefer atlasın.
continueLoop = false
continue
}
if(i<s.length-1 && (s[i] == 'C' || s[i] == 'X' || s[i] == 'I')){
if(romanToInt.get(s[i])!! < romanToInt.get(s[i+1])!!){
sum += romanToInt.get(s[i+1])!! - romanToInt.get(s[i])!!
continueLoop = true //Bir sonraki döngü es geçilecek.
}else{
sum += romanToInt.get(s[i])!!
}
}else{
sum += romanToInt.get(s[i])!!
}
}
return sum
}
}
Yorumlar
Yorum Gönder