[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多年,起源于罗马

罗马数字有如下符号:

基本字符 I V X L C D M
对应阿拉伯数字 1 5 10 50 100 500 1000

计数规则:

  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
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容