🌕 13. 罗马数字转整数
2022年6月20日
- algorithm
🌕 13. 罗马数字转整数
难度: 🌕
问题描述
解法 1
class Solution {
public int romanToInt(String s) {
// 思路:
// 将可能出现结果 与 值 放入 map
// 每次首先选取 2 个字符,如果能够匹配,则取;不能则取一个字符
int len = s.length();
HashMap<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);
int index = 0;
int res = 0;
while(index < len) {
if(index < len - 1) {
String cur = s.substring(index, index + 2);
if(map.containsKey(cur)) {
res += map.get(cur);
index += 2;
continue;
}
}
String str = s.substring(index, index + 1);
if(map.containsKey(str)) {
res += map.get(str);
index ++;
}
}
return res;
}
}
输出 1
解法 2 - 优化
class Solution {
public int romanToInt(String s) {
// 思路:
// 将可能出现结果 与 值 放入 map
// 优化
// 可以看出,当 2 个字符表示一个数字时,左边字符会比右边的小,此时 res 需要 减去这个字符的值
int len = s.length();
HashMap<Character, Integer> map = new HashMap<>();
map.put('M', 1000);
map.put('D', 500);
map.put('C', 100);
map.put('L', 50);
map.put('X', 10);
map.put('V', 5);
map.put('I', 1);
int res = 0;
for(int i = 0; i < len; i ++) {
char c = s.charAt(i);
int cur = map.get(c);
if(i == len - 1 || cur >= map.get(s.charAt(i + 1))) {
res += cur;
} else {
res -= cur;
}
}
return res;
}
}