package
0.0.0-20240429050328-3be44a187b12
Repository: https://github.com/robertwang/golang_study.git
Documentation: pkg.go.dev

# README

2024-01-19 练习题

来源 : 2024-01-19 Python 每日一练-LeetCode-字符串练习-罗马数字转换为整数

题目说明

将一个罗马数字转换为整数。

示例说明

例如:

  • 输入:s="III"

  • 输出:3

  • 输入:s="IX"

  • 输出:9

  • 输入:s="IV"

  • 输出:4

  • 输入:s="LVIII"

  • 输出:58

  • 解释:L=50,V=5,III=3。

  • 输入:s="MCMXCIV"

  • 输出:1994

  • 解释:M=1000,CM=900,XC=90,IV=4

罗马数字对照表

字符数值
I1
V5
X10
L50
C100
D500
M1000

罗马数字表示规则说明

罗马数字 2 写做 II,即为两个并列的 1。 12 写做 XII,即为 X+II。27 写做 XXVII,即为 XX+V+II。

通常情况下,罗马数字中小的数字在大的数字的右边。

但也存在特例:

例如 4 不写做 IIII,而是 IV。

数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 同样地,数字 9 表示为 IX。

这个特殊的规则只适用于以下六种情况:

  • ① 1 可以放在 V(5)、X(10)的左边,来表示 4 和 9。
  • ② X 可以放在 L(50)、C(100)的左边,来表示 40 和 90。
  • ③ C 可以放在 D(500)、M(1000)的左边来表示 400 和 900。
🔑 参考:

分析

按照转换规律,正常情况下遍历每个字符,罗马字符从小到大排列,累加上字符对应的数值即可。

但对于六种特殊情况,当数值小于后面一个字符的数值时,前一个小的数值要被减去。

所以通过 enumeratei 遍历出罗马数字的字符和索引。

当字符的索引不是最后一个字符,且对应的数值小于其后一个索引对应数值时减去该数值。用 resulti 存放转换后的数值

参考代码

Golang 代码实现

package main

import (
	"fmt"
)


// 实例 1: "LVIIIMCMXCIV" // 2050
// 入口
func main() {
	data := "LVIIIMCMXCIV"
	fmt.Println("初始数据", data)

	solution(data)
}

// 解决方案
func solution(roma_num string) {
	result := 0
	length := len(roma_num)
	symbol := map[string]int{
		"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000,
	}
	for i, char := range roma_num {
		if i < length-1 && symbol[string(char)] < symbol[string(roma_num[i+1])] {
			result -= symbol[string(char)]
		} else {
			result += symbol[string(char)]
		}	
	}
	fmt.Println(roma_num, "转换为整数为", result)
}

Python 代码实现

s = "LVIIIMCMXCIV"
# 转换为整数为: 2050

symbol = {
    "I": 1,
    "V": 5,
    "X": 10,
    "L": 50,
    "C": 100,
    "D": 500,
    "M": 1000
}
result = 0
n = len(s)
for i, ch in enumerate(s):
    value = symbol[ch]
    # 如果这个罗马数字既不是最后一个:又小于后面二个数守
    # 即属于六种特殊情况之裴减去这个值
    if i < n-1 and value < symbol[s[i+1]]:
        result -= value
    else:
        result += value
print(f"{s}转换为整数为:{result}")