美文网首页
13. Roman to Integer 罗马转数字

13. Roman to Integer 罗马转数字

作者: sarto | 来源:发表于2022-03-15 10:08 被阅读0次

题目

将罗马数字转换成整数,整数范围在 [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
}

相关文章

网友评论

      本文标题:13. Roman to Integer 罗马转数字

      本文链接:https://www.haomeiwen.com/subject/uwgedrtx.html