题目
将罗马数字转换成整数,整数范围在 [1,3999] 之间
解析
由于罗马数字存在左小右大的特殊情况,所以从左往右匹配是一个好的选择。
伪码
for i < len(s)
switch s[i]
case I
if s[i+1] == V || X
rst+=4, i+=2
rst+=1
case X
...
case C
...
default:
rst+=map[s[i]]
i+=1
代码
func romanToInt(s string) int {
m := map[uint8]int{
'I':1,
'V':5,
'X':10,
'L':50,
'C':100,
'D':500,
'M':1000,
}
var rst int
var i int
for ; i<len(s)-1; i++ {
switch s[i]{
case 'I':
if s[i+1] == 'V' || s[i+1] == 'X' {
rst += m[s[i+1]] - 1
i++
}else {
rst += 1
}
case 'X':
if s[i+1] == 'L' || s[i+1] == 'C' {
rst += m[s[i+1]] - 10
i++
}else {
rst += 10
}
case 'C':
if s[i+1] == 'D' || s[i+1] == 'M' {
rst += m[s[i+1]] - 100
i++
}else {
rst += 100
}
default:
rst+=m[s[i]]
}
}
if i == len(s)-1 {
rst+=m[s[i]]
}
return rst
}
这个解法就显得很愚笨,其实对于一个正确的罗马数字来说,如果右边一个数比左边一个数大,就说明是特殊情况,简化后。
func romanToInt(s string) int {
m := map[uint8]int{
'I':1,
'V':5,
'X':10,
'L':50,
'C':100,
'D':500,
'M':1000,
}
var rst int
var i int
for ; i<len(s)-1; i++ {
if m[s[i]] < m[s[i+1]] {
rst += m[s[i+1]]-m[s[i]]
i++
}else {
rst +=m[s[i]]
}
}
if i == len(s)-1 {
rst+=m[s[i]]
}
return rst
}
网友评论