昨天我們才剛把 Integer to Roman 搞懂,今天馬上迎來反向操作 —— Roman to Integer。
其實這題就像昨天的倒帶,只是方向顛倒了,但也有一些小陷阱要注意。
題目核心
羅馬數字轉換規則有兩種情況:
一般情況:數字從大到小排列,直接加起來就好。
例:XII = 10 + 1 + 1 = 12
減法情況:當小數字出現在大數字前面時,代表要做減法。
例:IV = 5 - 1 = 4,CM = 1000 - 100 = 900
解題思路
建立一個 HashMap,把每個羅馬字母對應的值存起來:
I → 1
V → 5
X → 10
L → 50
C → 100
D → 500
M → 1000
從左到右掃描字串:
如果「當前值 < 下一個值」,就代表這是一個「減法情況」,所以要用 next - current。
否則,直接加上當前值。
迴圈結束後,就能得到答案。
Java程式碼
import java.util.*;
class Solution {
public int romanToInt(String s) {
Map<Character, Integer> map = new HashMap<>();
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);
int result = 0;
for (int i = 0; i < s.length(); i++) {
int value = map.get(s.charAt(i));
// 如果不是最後一個字元,還要跟下一個比較
if (i + 1 < s.length() && value < map.get(s.charAt(i + 1))) {
result -= value;
} else {
result += value;
}
}
return result;
}
}
測試範例
"III" → 3
"LVIII" → 58
"MCMXCIV" → 1994
心得
這題其實就是把「特殊情況」抓出來。
昨天我們是從大數字往下拆,今天是從字串順序判斷「加」還是「減」。
我覺得這兩題放在一起練超有感,因為剛好前後呼應:
Integer to Roman → 貪心法 (從大到小挑最大的符號)
Roman to Integer → 掃描法 (遇到小的在大的前面就減)