思路
- 先把所有的罗马数拆分为单个字母存入数组
- 遍历这个数组,如果存在罗马的特定如IV、IX、XL、XC、CD、CM则作单独判断,因为一次性判断了2个字符,所以i要加1,再continue;
- 最后对那些单独的字母(不符合2个字符规则的)采用自己的数值相加
注意
1、i不能够超过整个数组的限定,否则报错,所以要加判断i != strList.size() - 1或者 i+1 < s.length()
/**
* 罗马数转为整数 I(1), V(5), X(10), L(50),C(100),D(500) 和 M(1000)
* @param s
* @return
*/
public int romanToInt(String s) {
ArrayList<String> strList = new ArrayList<>();
Integer sum = 0;
for (int i = 0;i<s.length();i++){
strList.add(s.substring(i,i+1));
}
for (int i = 0;i < strList.size();i++){
if(i != strList.size() - 1 && strList.get(i).equals("I") && strList.get(i+1).equals("V")){
sum += 4;i=i+1;continue;
}else if(i != strList.size() - 1 && strList.get(i).equals("I") && strList.get(i+1).equals("X")){
sum += 9;i=i+1;continue;
}
if(i != strList.size() - 1 && strList.get(i).equals("X") && strList.get(i+1).equals("L")){
sum += 40;i=i+1;continue;
}else if(i != strList.size() - 1 && strList.get(i).equals("X") && strList.get(i+1).equals("C")){
sum += 90;i=i+1;continue;
}
if(i != strList.size() - 1 && strList.get(i).equals("C") && strList.get(i+1).equals("D")){
sum += 400;i=i+1;continue;
}else if(i != strList.size() - 1 && strList.get(i).equals("C") && strList.get(i+1).equals("M")){
sum += 900;i=i+1;continue;
}
switch (strList.get(i)){
case "I":sum += 1;break;
case "V":sum += 5;break;
case "X":sum += 10;break;
case "L":sum += 50;break;
case "C":sum += 100;break;
case "D":sum += 500;break;
case "M":sum += 1000;break;
}
}
return sum;
}
后来发现有更好的方法,使用hashMap把所有存在的可能性都存进去,然后符合情况的再进行判断
containsKey函数:判断是否包含指定键名
class Solution {
public int romanToInt(String s) {
Map<String, Integer> map = new HashMap<>();
map.put("I", 1);
map.put("IV", 4);
map.put("V", 5);
map.put("IX", 9);
map.put("X", 10);
map.put("XL", 40);
map.put("L", 50);
map.put("XC", 90);
map.put("C", 100);
map.put("CD", 400);
map.put("D", 500);
map.put("CM", 900);
map.put("M", 1000);
int ans = 0;
for(int i = 0;i < s.length();) {
if(i + 1 < s.length() && map.containsKey(s.substring(i, i+2))) {
ans += map.get(s.substring(i, i+2));
i += 2;
} else {
ans += map.get(s.substring(i, i+1));
i ++;
}
}
return ans;
}
}