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;
}
}