羅馬數(shù)字轉(zhuǎn)整數(shù)
題目
羅馬數(shù)字包含以下七種字符: I拳魁, V惶桐, X, L潘懊,C姚糊,D 和 M。
字符 數(shù)值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如授舟, 羅馬數(shù)字 2 寫做 II
救恨,即為兩個(gè)并列的 1。12 寫做 XII
释树,即為 X + II
肠槽。 27 寫做 XXVII
, 即為 XX + V + II
。
通常情況下奢啥,羅馬數(shù)字中小的數(shù)字在大的數(shù)字的右邊秸仙。但也存在特例,例如 4 不寫做 IIII
桩盲,而是 IV
寂纪。數(shù)字 1 在數(shù)字 5 的左邊,所表示的數(shù)等于大數(shù) 5 減小數(shù) 1 得到的數(shù)值 4 赌结。同樣地捞蛋,數(shù)字 9 表示為 IX
。這個(gè)特殊的規(guī)則只適用于以下六種情況:
I
可以放在 V
(5) 和 X
(10) 的左邊姑曙,來表示 4 和 9襟交。
X
可以放在 L
(50) 和 C
(100) 的左邊,來表示 40 和 90伤靠。
C
可以放在 D
(500) 和 M
(1000) 的左邊捣域,來表示 400 和 900。
給定一個(gè)羅馬數(shù)字宴合,將其轉(zhuǎn)換成整數(shù)焕梅。輸入確保在 1 到 3999 的范圍內(nèi)。
示例 1:
輸入: "III"
輸出: 3
示例 2:
輸入: "MCMXCIV"
輸出: 1994
解釋: M = 1000, CM = 900, XC = 90, IV = 4.
分析
- 將對(duì)應(yīng)的羅馬數(shù)字使用
Character
格式作為Map的key
卦洽,對(duì)應(yīng)的int類型數(shù)字為value
贞言,保存到HashMap中 - 使用String類的
charAt()
方法獲取的值即為HashMap的key
- 對(duì)于特殊情況 (下一個(gè)字符對(duì)應(yīng)的值比當(dāng)前的字符對(duì)應(yīng)的值大),直接減去當(dāng)前的值
題解
public class RomanToInteger {
public int romanToInt(String s) {
Map<Character, Integer> romanMap = new HashMap<>(16);
romanMap.put('I', 1);
romanMap.put('V', 5);
romanMap.put('X', 10);
romanMap.put('L', 50);
romanMap.put('C', 100);
romanMap.put('D', 500);
romanMap.put('M', 1000);
int res = 0;
for (int i = 0; i < s.length(); i++) {
int curVal = romanMap.get(s.charAt(i));
int nexVal = i < s.length() - 1 ? romanMap.get(s.charAt(i + 1)) : 0;
res += curVal < nexVal ? - curVal : curVal;
}
return res;
}
}
結(jié)果
通過結(jié)果