สมมติว่าเรามีตัวเลขโรมัน เราต้องแปลงเป็นจำนวนเต็ม ตามที่เรารู้ตัวเลขโรมันแทนด้วยสัญลักษณ์ที่แตกต่างกันดังนี้:
| ตัวเลข | ค่า |
|---|---|
| I | 1 |
| V | 5 |
| X | 10 |
| L | 50 |
| C | 100 |
| D | 500 |
| M | 1000 |
ถ้าเราดูตัวเลขโรมันอย่างใกล้ชิด จะเห็นว่านั่นคือ เช่นตัวอักษร 'II' คือ 2 มี 'I' สองตัวบวกกัน สำหรับ XII คือ 12 นั่นคือ X + II = 10 + 2 = 12 ตัวเลขโรมันของ 4 ไม่ใช่ IIII แต่เป็น IV นี่คือส่วนที่棘手 (tricky)
- I สามารถใช้ก่อน V(5) และ X(10) เพื่อทำให้เป็น 4 และ 9 ตามลำดับ
- X สามารถใช้ก่อน L(50) และ C(100) เพื่อทำให้เป็น 40 และ 90 ตามลำดับ
- C สามารถใช้ก่อน D(500) และ M(1000) เพื่อทำให้เป็น 400 และ 900 ตามลำดับ
ในกรณีนี้ เราจะสร้างตัวแปลงโรมันเป็นจำนวนเต็ม ที่สามารถแปลงตัวเลขจาก 1 ถึง 3999 ได้
ในการแก้ปัญหานี้ เราจะสร้างตัวเลขโรมันที่เป็นไปได้และค่าของมัน รวมถึงค่าพิเศษเช่น 4, 9, 40, 90, 400, 900 ตอนนี้สแกนสตริงที่กำหนด ถ้าสับสตริงบางส่วนอยู่ในตาราง ให้เอาค่าของมันไปไว้ในผลลัพธ์ แล้วตรวจสอบต่อไป สำหรับการจับคู่อันต่อไป จะบวกค่ากับผลลัพธ์ จนกว่าจะได้ตัวเลข
ตัวอย่าง (Python)
class Solution(object):
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
roman = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000,'IV':4,'IX':9,'XL':40,'XC':90,'CD':400,'CM':900}
i = 0
num = 0
while i < len(s):
if i+1 < len(s) and s[i:i+2] in roman:
num += roman[s[i:i+2]]
i += 2
else:
num += roman[s[i]]
i += 1
return num
ob1 = Solution()
print(ob1.romanToInt("III"))
print(ob1.romanToInt("CDXLIII"))
อินพุต
"III" "CDXLIII"
เอาต์พุต
3 443