Skip to main content
No.1 Easy

  • 思路

🕚从罗马数字向整数转换,IV就是4,其实IV本身是一中特殊的情况。

罗马数字包含7种字符:

        I     1

        V    5

        x    10

        L    50

        C    100

        D    500

        M    1000

一般来说:大的数字在左边,小的数字在右边,只需要依次相加即可;

但像IV这种特殊的小的数字在左边大的数字在右边的情况,代表大的数字减去小的数字的值。

  • 解法

🚀看到题目是不是有点抽象,怎么才能把特殊情况包括进依次相加呢?

其实我们可以举个例子:MCMXCIV = +1000 -100 +1000 -10 +100 -1 +10 = 1994对吧

这样其实就能看出规律了。

当前数大于后一位的时候,加当前数;当前数字小于后一位的时候,减当前数字即可

扩展阅读

再简化一点:从后往前看,遇到比自己小的就减去,遇到比自己大的就加上。

下面是正常的解法🤡

class Solution {
Map<Character, Integer> symbolValues = new HashMap<Character, Integer>(){{
put('I',1);
put('V',5);
put('X',10);
put('L',50);
put('C',100);
put('D',500);
put('M',1000);
}};
public int romanToInt(String s) {
int ans = 0;
char[] sToChar = s.toCharArray();
for(int i = 0; i < s.length(); i++){
int value = symbolValues.get(sToChar[i]);
            // 此处可能疑问为什么要小于 length - 1
            // 因为毕竟是要往后一个比的,需要考虑out of index
if(i < s.length() - 1 && value < symbolValues.get(sToChar[i+1])){
ans -= value;
}else{
ans += value;
}
}
return ans;

}
}