class Solution {
public int romanToInt(String s) {
int sum = 0;
// 第一种,若是较大的值的左边有小值,则进行减法
int preNum = getValue(s.charAt(0));
for(int i = 1; i < s.length(); i++) {
int num = getValue(s.charAt(i));
if(preNum < num)
sum -= preNum;
else
sum += preNum;
// 把当前的num, 给到 preNum
preNum = num;
}
// 为什么要再加上 preNum,因为最后一个的值在循环中没有加上,所以要加上最后的一个num
sum += preNum;
return sum;
}
private int getValue(char ch) {
switch(ch) {
case 'I': return 1;
case 'V': return 5;
case 'X': return 10;
case 'L': return 50;
case 'C': return 100;
case 'D': return 500;
case 'M': return 1000;
default: return 0;
}
}
}
第二种方法
把特殊情况进行替换
然后进行相加
class Solution {
public int romanToInt(String s) {
// 把特殊的几种进行替换
s = s.replace("IV","a");
s = s.replace("IX","b");
s = s.replace("XL","c");
s = s.replace("XC","d");
s = s.replace("CD","e");
s = s.replace("CM","f");
int sum = 0;
for(int i = 0; i < s.length(); i++)
sum += getValue(s.charAt(i));
return sum;
}
private int getValue(char ch) {
switch(ch) {
case 'I': return 1;
case 'V': return 5;
case 'X': return 10;
case 'L': return 50;
case 'C': return 100;
case 'D': return 500;
case 'M': return 1000;
case 'a': return 4;
case 'b': return 9;
case 'c': return 40;
case 'd': return 90;
case 'e': return 400;
case 'f': return 900;
default: return 0;
}
}
}
第三种方法
这种类似键值,使用 hash
class Solution {
public int romanToInt(String s) {
HashMap<Character, Integer> map = 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);
}};
int sum = 0;
int n = s.length();
for(int i = 0; i < n; i++) {
int preNum = map.get(s.charAt(i));
if(i < n - 1 && preNum < map.get(s.charAt(i+1)) ) {
sum -= preNum; // 如果第i+1个字符的值大于第i个字符的值,则减去value
}
else
sum += preNum;
}
return sum;
}
}