13. 羅馬數(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 吏够,即為兩個并列的 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柱蟀。這個特殊的規(guī)則只適用于以下六種情況:
- I 可以放在 V (5) 和 X (10) 的左邊,來表示 4 和 9蚜厉。
- X 可以放在 L (50) 和 C (100) 的左邊长已,來表示 40 和 90。
- C 可以放在 D (500) 和 M (1000) 的左邊昼牛,來表示 400 和 900术瓮。
給定一個羅馬數(shù)字,將其轉(zhuǎn)換成整數(shù)贰健。輸入確保在 1 到 3999 的范圍內(nèi)胞四。
題解
思路
- 首先將所有的組合可能性列出并添加到哈希表中
- 然后對字符串進(jìn)行遍歷,由于組合只有兩種伶椿,一種是 1 個字符辜伟,一種是 2 個字符,2個字符優(yōu)先
- 先判斷兩個字符的組合在哈希表中是否存在脊另,存在則將值取出加到結(jié)果 ans 中导狡,并向后移2個字符。不存在則將判斷當(dāng)前 1 個字符是否存在偎痛,存在則將值取出加到結(jié)果 res中旱捧,并向后移 1 個字符
- 遍歷結(jié)束返回結(jié)果 res
class Solution {
public int romanToInt(String s) {
//創(chuàng)建存放組合的Map
Map<String, Integer> map = new HashMap<>();
map.put("I", 1);
map.put("IV", 4);
map.put("V", 5);
map.put("IX", 9);
map.put("X", 10);
map.put("XL", 40);
map.put("L", 50);
map.put("XC", 90);
map.put("C", 100);
map.put("CD", 400);
map.put("D", 500);
map.put("CM", 900);
map.put("M", 1000);
//存放結(jié)果
int res = 0;
//從頭開始遍歷
for(int i = 0;i < s.length();) {
//判斷是否在Map中
if(i + 1 < s.length() && map.containsKey(s.substring(i, i+2))) {
res+= map.get(s.substring(i, i+2));
i += 2;
} else {
res+= map.get(s.substring(i, i+1));
i ++;
}
}
return res;
}
}
使用Map結(jié)構(gòu)