以次遍历,根据大小判断加减。

    1. # 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
    2. #
    3. # 字符 数值
    4. # I 1
    5. # V 5
    6. # X 10
    7. # L 50
    8. # C 100
    9. # D 500
    10. # M 1000
    11. #
    12. # 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + I
    13. # I 。
    14. #
    15. # 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5
    16. # 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
    17. #
    18. #
    19. # I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
    20. # X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
    21. # C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
    22. #
    23. #
    24. # 给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
    25. #
    26. # 示例 1:
    27. #
    28. # 输入: "III"
    29. # 输出: 3
    30. #
    31. # 示例 2:
    32. #
    33. # 输入: "IV"
    34. # 输出: 4
    35. #
    36. # 示例 3:
    37. #
    38. # 输入: "IX"
    39. # 输出: 9
    40. #
    41. # 示例 4:
    42. #
    43. # 输入: "LVIII"
    44. # 输出: 58
    45. # 解释: L = 50, V= 5, III = 3.
    46. #
    47. #
    48. # 示例 5:
    49. #
    50. # 输入: "MCMXCIV"
    51. # 输出: 1994
    52. # 解释: M = 1000, CM = 900, XC = 90, IV = 4.
    53. # Related Topics 数学 字符串
    54. # 👍 987 👎 0
    55. # leetcode submit region begin(Prohibit modification and deletion)
    56. class Solution(object):
    57. def romanToInt(self, s):
    58. """
    59. :type s: str
    60. :rtype: int
    61. """
    62. digits = {
    63. "I": 1,
    64. "V": 5,
    65. "X": 10,
    66. "L": 50,
    67. "C": 100,
    68. "D": 500,
    69. "M": 1000,
    70. }
    71. sum = 0
    72. maxIndex = len(s) - 1
    73. for i, v in enumerate(s):
    74. if i >= maxIndex:
    75. sum += digits[v]
    76. break
    77. now = digits[v]
    78. next_v = digits[s[i + 1]]
    79. if now >= next_v:
    80. sum += now
    81. else:
    82. sum -= now
    83. return sum
    84. # leetcode submit region end(Prohibit modification and deletion)
    85. s = Solution()
    86. print(s.romanToInt("LVIII"))