13-罗马数字转整数(Go)

4 阅读2分钟

题目

来源:LeetCode第13题

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  1. I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  2. X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
  3. C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给定一个罗马数字,将其转换成整数。

代码

最初代码:

func romanToInt(s string) int {
    RomanMap := map[string]int{
        "I":1,
        "V":5,
        "X":10,
        "L":50,
        "C":100,
        "D":500,
        "M":1000,
        "IV":4,
        "IX":9,
        "XL":40,
        "XC":90,
        "CD":400,
        "CM":900,
    }
    a := 0
   for i := 0; i < len(s); i++ {
		// 步骤1:判断是否能截取双字符(避免越界),且双字符在map中存在
		if i+1 < len(s) {
			twoChar := s[i : i+2] // 截取双字符字符串
			if val, exists := RomanMap[twoChar]; exists {
				a += val
				i++ // 双字符已处理,i步进+1,避免下一次循环重复处理
				continue
			}
		}

		// 步骤2:处理单个字符(将byte转换为string,匹配map键类型)
		oneChar := string(s[i])
		a += RomanMap[oneChar]
	}
    return a
}

占用内存6.4MB,时间1ms

优化后的代码:

func romanToInt(s string) int {
    RomanMap := map[byte]int{
        'I':1,
        'V':5,
        'X':10,
        'L':50,
        'C':100,
        'D':500,
        'M':1000,
    }
    a := 0
   for i := 0; i < len(s)-1; i++ {
		b := RomanMap[s[i]]
        if(b>=RomanMap[s[i+1]]) {
            a+=b
        } else {
            a-=b
        }
	}
    a+=RomanMap[s[len(s)-1]]
    return a
}

占用内存4.6MB,时间1ms

Go语言基础巩固

  1. for和if都不需要加括号,且for ,if ,else 必须和括号在同一行里面
  2. string类型单个字母提取出来是byte类型的。
  3. 与Python不同,Go语言中单引号代表byte类型,双引号代表string类型,且string类型不可变。