首先簡(jiǎn)單介紹一下羅馬數(shù)字畸陡,一下摘自維基百科
羅馬數(shù)字共有7個(gè)鹰溜,即I(1)虽填、V(5)、X(10)曹动、L(50)斋日、C(100)、D(500)和M(1000)墓陈。按照下述的規(guī)則可以表示任意正整數(shù)恶守。需要注意的是羅馬數(shù)字中沒(méi)有“0”,與進(jìn)位制無(wú)關(guān)贡必。一般認(rèn)為羅馬數(shù)字只用來(lái)記數(shù)兔港,而不作演算。
重復(fù)數(shù)次:一個(gè)羅馬數(shù)字重復(fù)幾次仔拟,就表示這個(gè)數(shù)的幾倍衫樊。
右加左減:在較大的羅馬數(shù)字的右邊記上較小的羅馬數(shù)字,表示大數(shù)字加小數(shù)字利花。
在較大的羅馬數(shù)字的左邊記上較小的羅馬數(shù)字科侈,表示大數(shù)字減小數(shù)字。
左減的數(shù)字有限制炒事,僅限于I臀栈、X、C挠乳。比如45不可以寫(xiě)成VL权薯,只能是XLV
但是,左減時(shí)不可跨越一個(gè)位數(shù)睡扬。比如盟蚣,99不可以用IC(
)表示,而是用XCIX(
)表示威蕉。(等同于阿拉伯?dāng)?shù)字每位數(shù)字分別表示刁俭。)
左減數(shù)字必須為一位橄仍,比如8寫(xiě)成VIII韧涨,而非IIX。
右加數(shù)字不可連續(xù)超過(guò)三位侮繁,比如14寫(xiě)成XIV虑粥,而非XIIII。(見(jiàn)下方“數(shù)碼限制”一項(xiàng)宪哩。)
加線乘千:在羅馬數(shù)字的上方加上一條橫線或者加上下標(biāo)的?娩贷,表示將這個(gè)數(shù)乘以1000,即是原數(shù)的1000倍锁孟。
同理彬祖,如果上方有兩條橫線茁瘦,即是原數(shù)的1000000(
)倍。
數(shù)碼限制:同一數(shù)碼最多只能出現(xiàn)三次储笑,如40不可表示為XXXX甜熔,而要表示為XL。
例外:由于IV是古羅馬神話主神朱庇特(即IVPITER突倍,古羅馬字母里沒(méi)有J和U)的首字腔稀,因此有時(shí)用IIII代替IV。
public class Solution {
public int romanToInt(String s) {
int len = s.length();
HashMap<Character,Integer> map = new HashMap<Character,Integer>();
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 total = map.get(s.charAt(0));
for(int i = 1;i < len;i++) {
if(map.get(s.charAt(i)) > map.get(s.charAt(i-1))) {
total = total + map.get(s.charAt(i)) - 2*map.get(s.charAt(i - 1));
}else{
total = total + map.get(s.charAt(i));
}
}
return total;
}
}