代码实现

粗糙的实现

  1. class Solution:
  2. def romanToInt(self, s: str) -> int:
  3. res=0
  4. length=len(s)
  5. dic={}
  6. dic['I']=1
  7. dic['V']=5
  8. dic['X']=10
  9. dic['L']=50
  10. dic['C']=100
  11. dic['D']=500
  12. dic['M']=1000
  13. res=0
  14. i=0
  15. while i<length:
  16. if i<length-1:
  17. if s[i]=='I' and s[i+1]=='V':
  18. res=res+dic['V']-1
  19. i=i+2
  20. elif s[i]=='I' and s[i+1]=='X':
  21. res=res+dic['X']-1
  22. i=i+2
  23. elif s[i]=='X' and s[i+1]=='L':
  24. res=res+dic['L']-10
  25. i=i+2
  26. elif s[i]=='X' and s[i+1]=='C':
  27. res=res+dic['C']-10
  28. i=i+2
  29. elif s[i]=='C' and s[i+1]=='D':
  30. res=res+dic['D']-100
  31. i=i+2
  32. elif s[i]=='C' and s[i+1]=='M':
  33. res=res+dic['M']-100
  34. i=i+2
  35. else:
  36. res=res+dic[s[i]]
  37. i=i+1
  38. else:
  39. res=res+dic[s[i]]
  40. i=i+1
  41. return res

基本上是按照直观的想法实现的,抽象程度不够。

解法

从题干中得知:

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

只有这六种情况下,才使用减法,在其他情况下罗马数字先大后小组合->开始的六种情况先小后大。【总结出共性】
所以我们处理一个字符时,若它比后面的字符小,则应用减法,否则正常累加。

  1. class Solution:
  2. def romanToInt(self, s: str) -> int:
  3. length=len(s)
  4. res=0
  5. dic={"I":1,"V":5,"X":10,"L":50,"C":100,"D":500,"M":1000}
  6. for i in range(length-1):
  7. if dic[s[i]]<dic[s[i+1]]:
  8. res=res-dic[s[i]]
  9. else:
  10. res=res+dic[s[i]]
  11. res=res+dic[s[-1]]
  12. return res

13、python实现罗马数字转整数
[LeetCode] 13. Roman to Integer 罗马数字转化成整数 # 强烈推荐