罗马数字包含以下七种字符: 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。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。

示例 1:

输入: s = “III”
输出: 3
示例 2:

输入: s = “IV”
输出: 4
示例 3:

输入: s = “IX”
输出: 9
示例 4:

输入: s = “LVIII”
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:

输入: s = “MCMXCIV”
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

提示:

1 <= s.length <= 15
s 仅含字符 (‘I’, ‘V’, ‘X’, ‘L’, ‘C’, ‘D’, ‘M’)
题目数据保证 s 是一个有效的罗马数字,且表示整数在范围 [1, 3999] 内
题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。
IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。
关于罗马数字的详尽书写规则,可以参考 罗马数字 - Mathematics 。

解答:

  1. /**
  2. * @param {string} s
  3. * @return {number}
  4. */
  5. var romanToInt = function(s) {
  6. const map = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
  7. let num = 0
  8. for(var i =0;i<s.length;i++){
  9. if(map[s[i]]<map[s[i+1]]){
  10. num -= map[s[i]]
  11. }else{
  12. num += map[s[i]]
  13. }
  14. }
  15. return num
  16. };

字符串截
解题思路
反正罗马数字就是来来去去的这几个字符,特殊的也就这几个,那就把他们跟他们的值都放到一个对象里头,然后发现他们有两种,一种是一个字符的,一种是两个字符的,那就分情况,首先考虑到的截取字符串,循环截取目标字符串里的两个字符,如果这个两个字符拼到一起的新字符正好在这个大的对象里头,就把它抛出来;如果截下来的两个字符没在这个里头,那就不是特殊的,就走另一个情况,那就是只截取一个字符串然后方法同上的在加回去,最后输出出来就是了。

  1. var romanToInt = function(s) {
  2. let object={I:1,IV:4,V:5,IX:9,X:10,XL:40,L:50,XC:90,C:100,CD:400,D:500,CM:900,M:1000};
  3. let num=0;
  4. for(let i = 0;i < s.length;){
  5. if(i + 1 < s.length && object[s.substring(i, i + 2)]){
  6. num = num + object[s.substring(i, i + 2)];
  7. i = i + 2;
  8. }else{
  9. num = num + object[s.substring(i, i + 1)];
  10. i = i + 1;
  11. }
  12. }
  13. return num;
  14. };