给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
思路和12反过来,仍然采用暴力破解:
发现可能的罗马字符串组合顶多两位,所以每次从头两位开始判断,如果有符合的,则直接删除这两位,并找出对应的结果,如果不符合,则从头开始的第一个字符一定符合,并找出对应的结果,
如此循环到给出的字符串s只剩1位或1位都不剩时结束,并且根据最后的情况更新输出即可
代码如下:
public int romanToInt(String s) { int result = 0; Map<String, Integer> map = new HashMap<>(); map.put("M", 1000); map.put("CM", 900); map.put("D", 500); map.put("CD", 400); map.put("C", 100); map.put("XC", 90); map.put("L", 50); map.put("XL", 40); map.put("X", 10); map.put("IX", 9); map.put("V", 5); map.put("IV", 4); map.put("I", 1); while (s.length() > 1){ int i = 2; if (map.get(s.substring(0, i)) == null){ i--; } result = result + map.get(s.substring(0, i)); s = s.substring(i); } if (s.isEmpty()){ return result; }else { return result + map.get(s); } }
查看官方给出的解法,发现思路差不多一致,代码如下:
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;
int n = s.length();
for (int i = 0; i < n; ++i) {
int value = symbolValues.get(s.charAt(i));
if (i < n - 1 && value < symbolValues.get(s.charAt(i + 1))) {
ans -= value;
} else {
ans += value;
}
}
return ans;
}
}