leetcode-13-easy
Roman to Integer
思路一: 暴力求解,遍历字符,遇到 6 种特殊的组合字符单独计算
static Map<Character, Integer> map = new HashMap<>();
static Map<String, Integer> combine = new HashMap<>();
static {
map.put('I', 1);
map.put('V', 5);
map.put('X', 10);
map.put('L', 50);
map.put('C', 100);
map.put('D', 500);
map.put('M', 1000);
combine.put("IV", 4);
combine.put("IX", 9);
combine.put("XL", 40);
combine.put("XC", 90);
combine.put("CD", 400);
combine.put("CM", 900);
}
public static int romanToInt(String s) {
char[] chars = s.toCharArray();
int result = 0;
for (int i = 0; i < chars.length; i++) {
if ((chars[i] == 'I' || chars[i] == 'X' || chars[i] == 'C') && (i + 1) < chars.length) {
String key = new String(new char[]{chars[i], chars[i + 1]});
if (combine.containsKey(key)) {
result += combine.get(key);
i++;
} else {
result += map.get(chars[i]);
}
} else {
result += map.get(chars[i]);
}
}
return result;
}
思路二: 更巧妙的思路,不要把 6 种特殊的情况的字符组合起来,还是按照单独字符看,只不过 6 种特殊情况都是小在大的左边,则小的变成负数
public static int romanToInt(String s) {
int result = 0;
int pre = map.get(s.charAt(0));
char[] arr = s.toCharArray();
for (int i = 1; i < arr.length; i++) {
char c = arr[i];
if (pre < map.get(c)) {
result -= pre;
} else {
result += pre;
}
pre = map.get(c);
}
return result + pre;
}
思路三: 更容易理解的思路,把 6 种特殊情况下的组合字符都用 6 个单独的字符替换,map 增加 6 新字符对应的值,依次遍历求解
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 result = 0;
for (int i=0; i<s.length(); i++) {
result += which(s.charAt(i));
}
return result;
}
public int which(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;
}
return 0;
}

浙公网安备 33010602011771号