鏈接:https://leetcode.com/problems/roman-to-integer/#/description
難度:Easy
題目:13. Roman to Integer
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
翻譯:將給定的羅馬數(shù)字轉(zhuǎn)化為整數(shù)氛琢,輸入保證在1~3999之間
概念:什么是羅馬數(shù)字琐驴?
羅馬數(shù)字共有7個(gè),即Ⅰ(1)带到、Ⅴ(5)熊响、Ⅹ(10)旨别、?(50)、?(100)汗茄、?(500)和?(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ù)字必須為一位南捂,比如8寫(xiě)成VIII吴裤,而非IIX。
右加數(shù)字不可連續(xù)超過(guò)三位溺健,比如14寫(xiě)成XIV麦牺,而非XIIII。
數(shù)碼限制:同一數(shù)碼最多只能連續(xù)出現(xiàn)三次鞭缭,如40不可表示為XXXX剖膳,而要表示為XL。等
——維基百科
tips: 3999范圍內(nèi)的羅馬數(shù)字不會(huì)用到加上劃線的字母
思路:從最后一個(gè)字符開(kāi)始岭辣,如果當(dāng)前字符對(duì)應(yīng)的數(shù)字比上一個(gè)數(shù)字小吱晒,那么就把結(jié)果減去當(dāng)前字符對(duì)應(yīng)的數(shù)字,否則加上當(dāng)前字符對(duì)應(yīng)數(shù)字沦童。為了處理邊界情況仑濒,在原字符串最后添加一個(gè)字符,該字符是原來(lái)的尾字符偷遗。
參考代碼:
Java
public class Solution {
public int romanToInt(String s) {
if(s==null || s.length()==0)
return 0;
Map<Character, Integer> m = new HashMap<Character, Integer>();
m.put('I',1);
m.put('V',5);
m.put('X',10);
m.put('L',50);
m.put('C', 100);
m.put('D', 500);
m.put('M', 1000);
int length = s.length();
int result = m.get(s.charAt(length-1));
for (int i=length-2; i>=0; i--){
if(m.get(s.charAt(i))<m.get(s.charAt(i+1)))
result -= m.get(s.charAt(i));
else
result += m.get(s.charAt(i));
}
return result;
}
}