Roma Rakamı Algoritmaları: Python, JavaScript ve Java Uygulamaları
Python, JavaScript ve Java'da Roma rakamı dönüştürme algoritmalarının nasıl uygulanacağını öğrenin. Optimize edilmiş kod, karmaşıklık analizi ve açgözlü algoritma açıklamalarını içerir.
Roma rakamları ile tam sayılar arasında dönüşüm yapmak, kodlama mülakatlarında, rekabetçi programlamada ve gerçek dünya uygulamalarında karşımıza çıkan klasik bir programlama problemidir. Bu kılavuz, temel algoritmaların açıklamalarıyla birlikte Python, JavaScript ve Java dillerinde optimize edilmiş uygulamalar sunar.
Problemi Anlamak
İki ilgili problemi çözmemiz gerekiyor:
- Tam Sayıdan Roma Rakamına: Bir Arap sayısını (örneğin 1994) Roma rakamlarına (MCMXCIV) dönüştürmek.
- Roma Rakamından Tam Sayıya: Roma rakamlarını (örneğin MCMXCIV) bir Arap sayısına (1994) dönüştürmek.
Kısıtlamalar
- Giriş aralığı: 1 ile 3999 arası (standart Roma rakamı aralığı).
- Standart çıkarma notasyonu kullanın (IV, IX, XL, XC, CD, CM).
- Tüm geçerli Roma rakamı kombinasyonlarını destekleyin.
Açgözlü Algoritma (Greedy Algorithm) Yaklaşımı
Her iki dönüşüm de bir açgözlü algoritma stratejisi kullanır:
Tam Sayıdan Roma Rakamına (Açgözlü)
- Değerlerin Roma rakamlarına eşlendiği azalan sırada bir liste oluşturun.
- Her değer-rakam çifti için:
- Bu rakamdan mümkün olduğunca çok kullanın.
- Kullanılan değeri kalan sayıdan çıkarın.
- Sayı sıfıra ulaşana kadar tekrarlayın.
Roma Rakamından Tam Sayıya (Açgözlü)
- Roma rakamı dizesini soldan sağa doğru tarayın.
- Her sembol için:
- Eğer kendisinden sonraki sembolden küçükse, onu çıkarın (çıkarma notasyonu).
- Aksi takdirde, onu ekleyin.
- Toplam sonucu döndürün.
Python Uygulaması
Tam Sayıdan Roma Rakamına
def int_to_roman(num: int) -> str:
"""
Bir tam sayıyı Roma rakamlarına dönüştürür.
Zaman Karmaşıklığı: O(1) - sabit iterasyon sayısı (13)
Alan Karmaşıklığı: O(1) - sabit boyutlu eşleme
"""
# Azalan sırada eşleme (çıkarma kombinasyonları dahil)
values = [
(1000, 'M'), (900, 'CM'), (500, 'D'), (400, 'CD'),
(100, 'C'), (90, 'XC'), (50, 'L'), (40, 'XL'),
(10, 'X'), (9, 'IX'), (5, 'V'), (4, 'IV'), (1, 'I')
]
result = []
for value, numeral in values:
count = num // value
if count:
result.append(numeral * count)
num -= value * count
return ''.join(result)
Roma Rakamından Tam Sayıya
def roman_to_int(s: str) -> int:
"""
Roma rakamlarını bir tam sayıya dönüştürür.
Zaman Karmaşıklığı: O(n) - n dize uzunluğudur
Alan Karmaşıklığı: O(1)
"""
roman_map = {
'I': 1, 'V': 5, 'X': 10, 'L': 50,
'C': 100, 'D': 500, 'M': 1000
}
result = 0
prev_value = 0
# Sağdan sola doğru tara
for char in reversed(s):
value = roman_map[char]
if value < prev_value:
result -= value
else:
result += value
prev_value = value
return result
JavaScript Uygulaması
Tam Sayıdan Roma Rakamına
function intToRoman(num) {
const values = [
[1000, 'M'], [900, 'CM'], [500, 'D'], [400, 'CD'],
[100, 'C'], [90, 'XC'], [50, 'L'], [40, 'XL'],
[10, 'X'], [9, 'IX'], [5, 'V'], [4, 'IV'], [1, 'I']
];
let result = '';
for (const [value, numeral] of values) {
while (num >= value) {
result += numeral;
num -= value;
}
}
return result;
}
Algoritma Analizi
Zaman Karmaşıklığı
Tam Sayıdan Roma Rakamına:
- O(1) - Sabit zaman. Giriş boyutundan bağımsız olarak her zaman tam olarak 13 çift üzerinden geçer.
Roma Rakamından Tam Sayıya:
- O(n) - Doğrusal zaman. Dizideki her karakterin bir kez incelenmesi gerekir.
Neden Açgözlü Algoritma Çalışır?
Açgözlü algoritma Roma rakamları için çalışır çünkü:
- Optimal Altyapı: Optimal çözüm, alt problemlerin optimal çözümlerini içerir.
- Örtüşmeyen Alt Problemler: Her değer bağımsız olarak kullanılır.
- Her zaman mümkün olan en büyük değeri kullanmak, en kısa Roma rakamı temsilini garanti eder.
Sonuç
Roma rakamı dönüştürme algoritmaları, optimal altyapıya sahip problemler için açgözlü yaklaşımın gücünü gösterir. İster mülakatlara hazırlanın ister bir belge oluşturucu yazın, bu uygulamalar sağlam bir temel sağlar.
Kod yazmadan kullanıcı dostu bir arayüz için, anında sonuç veren çevrimiçi Roma rakamı dönüştürücümüzü deneyebilirsiniz.
Daha fazlasını mı öğrenmek istiyorsunuz? Roma rakamları okuma kılavuzumuza göz atın veya Excel'de Roma rakamı kullanımını inceleyin.