题目
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
}