題目
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
解題思路
羅馬數字是最古老的數字表示方式,比阿拉伯數組早2000多年,起源于羅馬
羅馬數字有如下符號:
基本字符 | I | V | X | L | C | D | M |
---|---|---|---|---|---|---|---|
對應阿拉伯數字 | 1 | 5 | 10 | 50 | 100 | 500 | 1000 |
計數規則:
- 相同的數字連寫,所表示的數等于這些數字相加得到的數,例如:III = 3
- 小的數字在大的數字右邊,所表示的數等于這些數字相加得到的數,例如:VIII = 8
- 小的數字,限于(I、X和C)在大的數字左邊,所表示的數等于大數減去小數所得的數,例如:IV = 4
- 正常使用時,連續的數字重復不得超過三次
- 在一個數的上面畫橫線,表示這個數擴大1000倍(本題只考慮3999以內的數,所以用不到這條規則)
其次,羅馬數字轉阿拉伯數字規則(僅限于3999以內):
從前向后遍歷羅馬數字,如果某個數比前一個數小,則加上該數。反之,減去前一個數的兩倍然后加上該數
代碼
func romanToInt(s string) int {
var romanMap map[string]int
romanMap = make(map[string]int)
romanMap["I"] = 1
romanMap["V"] = 5
romanMap["X"] = 10
romanMap["L"] = 50
romanMap["C"] = 100
romanMap["D"] = 500
romanMap["M"] = 1000
var sum int
sLen := len(s)
sum = romanMap[s[sLen-1:sLen]]
for i := sLen - 2; i >= 0; i-- {
s1 := s[i+1 : i+2]
s2 := s[i : i+1]
num1 := romanMap[s1]
num2 := romanMap[s2]
fmt.Printf("num1:%+v, num2:%+v\n", num1, num2)
if num1 <= num2 {
sum = sum + num2
} else {
sum = sum - num2
}
fmt.Printf("%+v, sum:%+v\n", i, sum)
}
fmt.Printf("***********\nroman:%+v, integer:%+v\n*******\n", s, sum)
return sum
}