两个方法。第一个方法相对较为复杂。
第一个方法是把传入的罗马数字,每一个相对应的转为整数,再通过比较写入ArrayList集合的数据大小,进行判断加或减。(由于集合中的对象,是Object,比较的时候,需要的又是整数类型,所以需要强转)。int类型无法使用String.valueOf()进行强转,所以要用integer包装类。
第二个方法是利用逆序数遍历。由于罗马数字的运算法则最后一个一定为加法,所以遍历从倒数第二个开始。
下面是代码:
法一:
import java.util.ArrayList;
public class leetCode_13_Method1 {
public int romanToInt(String s) {
int sum = 0;
ArrayList arr = new ArrayList();
setDate(s, arr);
for (int i = arr.size() - 2; i >= 0; i--) {
int j = i + 1;
int dateI = Integer.parseInt(String.valueOf(arr.get(i)));
int dateJ = Integer.parseInt(String.valueOf(arr.get(j)));
if (dateJ > dateI) {
sum -= dateI;
}
if (dateJ <= dateI) {
sum += dateI;
}
}
sum += Integer.parseInt(String.valueOf(arr.get(arr.size() - 1)));
return sum;
}
public static void setDate(String s, ArrayList arr) {
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
String string = Character.toString(ch);
if (string.equals("I")) {
arr.add("1");
}
if (string.equals("V")) {
arr.add("5");
}
if (string.equals("X")) {
arr.add("10");
}
if (string.equals("L")) {
arr.add("50");
}
if (string.equals("C")) {
arr.add("100");
}
if (string.equals("D")) {
arr.add("500");
}
if (string.equals("M")) {
arr.add("1000");
}
}
}
}
法二:
public class leetCode_13_Method2 {
public static int romanToInt(String s) {
int sum = 0;
char[] ch = s.toCharArray();
for (int i = ch.length - 2; i >= 0; i--) {
int j = i + 1;
if (getValue(ch[j]) > getValue(ch[i])) {
sum = sum - getValue(ch[i]);
} else if (getValue(ch[j]) <= getValue(ch[i])) {
sum = sum + getValue(ch[i]);
}
}
sum = sum + getValue(ch[ch.length - 1]);
return sum;
}
private static int getValue(char chUnit) {
switch (chUnit) {
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;
}
}
}