[LeetCode By Go 49]13. Roman to Integer

题目

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

解题思路

罗马数字是最古老的数字表示方式,比阿拉伯数组早2000多年,起源于罗马

罗马数字有如下符号:

基本字符IVXLCDM
对应阿拉伯数字1510501005001000

计数规则:

  1. 相同的数字连写,所表示的数等于这些数字相加得到的数,例如:III = 3
  2. 小的数字在大的数字右边,所表示的数等于这些数字相加得到的数,例如:VIII = 8
  3. 小的数字,限于(I、X和C)在大的数字左边,所表示的数等于大数减去小数所得的数,例如:IV = 4
  4. 正常使用时,连续的数字重复不得超过三次
  5. 在一个数的上面画横线,表示这个数扩大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
}
    原文作者:miltonsun
    原文地址: https://www.jianshu.com/p/5cf4111da71b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞