題目:
分析
思路一:由于是在有限的數(shù)字中將羅馬數(shù)字轉(zhuǎn)換為阿拉伯?dāng)?shù)字所以可以采取列表發(fā),將字符串可能出現(xiàn)的情況全部都列出來,然后在字符串中查找是否出現(xiàn)相應(yīng)的字符串來判斷相應(yīng)的值。如全部可能的情況如下:
{"0","I","II","III","IV","V","VI","VII","VIII","IX"},
{"0","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
{"0","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
{"0","M","MM","MMM"}
然后又羅馬數(shù)字如"CDLXXI",先判斷"MMM"在該數(shù)字中是否出現(xiàn)疗我,然后判斷在結(jié)果中是否加上該值咆畏。由于"MMM"沒在該數(shù)字中出現(xiàn),所以不加上該值吴裤。同理旧找,發(fā)現(xiàn)最先出現(xiàn)的是"CD"就在結(jié)果中加上400,然后出現(xiàn)的是"LXX"就加上70嚼摩,最后出現(xiàn)的是"I"就加上1钦讳,得到471。這個(gè)過程中唯一需要注意的就是一定要從大值開始查找枕面,如在數(shù)字中查找“XX”和“XXX”時(shí)愿卒,如果從小值查找就會(huì)出錯(cuò)(讀者可以嘗試使用“MXXX”驗(yàn)證)。
思路二:我們發(fā)現(xiàn)羅馬數(shù)字中位于左邊的值小于其右邊的值時(shí)潮秘,只需要大值減掉小值即可表示該字符串表示的值琼开,如"XL"表示L-X=50-10=40,并且需要減得情況只有一位枕荞,即不會(huì)出現(xiàn)“XXL”的情況柜候。當(dāng)羅馬數(shù)字中小值位于大值右邊時(shí),加上該小值即可躏精,如“LXX”表示L+X+X=50+10+10=70渣刷。因此只需遍歷一次羅馬數(shù)字即可,如"CDLXXI",先是“C”,即在結(jié)果中加上100矗烛,然后再是“D”辅柴,因?yàn)镃<D(100<500),所以這兩個(gè)字符表示(D-C=500-100=400),因此在結(jié)果中加上500瞭吃,再減200(處理“C”時(shí)加上了100碌嘀,而實(shí)際情況這一百應(yīng)該是被減掉的,因此應(yīng)該減掉100歪架,再減掉之前加上的100)股冗,得到400,再是“L”,直接加上50(D>L)即可和蚪,結(jié)果得到450止状,再是“X”,加上10即可(L>X)),得到460攒霹,再是“X”加上10(X=X)导俘,得到470,最后是“I”,加上1即可(X>I)剔蹋,得到最后的結(jié)果旅薄,即471。
詳細(xì)思路可以看代碼。
代碼
java版
public class Solution
{
public int romanToInt(String s)
{
String[][] c={{"0","I","II","III","IV","V","VI","VII","VIII","IX"},
{"0","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
{"0","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
{"0","M","MM","MMM"}};
int total=0;
for(int i=3;i>=0;i--)
{
for (int j=c[i].length-1;j>=0;j--)
{
String x=c[i][j];
if(s.contains(x) && s.startsWith(x))
{
total+=j*Math.pow(10,i);
s=s.substring(x.length());
//System.out.println(s);
break;
}
}
}
return total;
}
}
java版本2
public class Solution
{
public int romanToInt(String s)
{
Map<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(s.length()-1));
int pre=total;
for(int i=s.length()-2;i>=0;i--)
{
int cur=map.get(s.charAt(i));
if(cur<pre)
{
total=total-cur;
}
else
{
total=total+cur;
}
pre=cur;
}
return total;
}
}
java版本3
public class Solution
{
public int romanToInt(String s)
{
int nums[]=new int[s.length()];
for(int i=0;i<s.length();i++){
switch (s.charAt(i)){
case 'M':
nums[i]=1000;
break;
case 'D':
nums[i]=500;
break;
case 'C':
nums[i]=100;
break;
case 'L':
nums[i]=50;
break;
case 'X' :
nums[i]=10;
break;
case 'V':
nums[i]=5;
break;
case 'I':
nums[i]=1;
break;
}
}
int sum=0;
for(int i=0;i<nums.length-1;i++){
if(nums[i]<nums[i+1])
sum-=nums[i];
else
sum+=nums[i];
}
return sum+nums[nums.length-1];
}
}
C語言版
int getValue(char c)
{
switch(c)
{
case 'I':
return 1;
case 'V':
return 5;
case 'X':
return 10;
case 'L':
return 50;
case 'C':
return 100;
case 'D':
return 500;
case 'M':
return 1000;
default:
return 0;
}
}
int romanToInt(char* s)
{
int total=getValue(s[0]);
int pre=total;
s++;
while(*s)
{
int cur=getValue(s[0]);
if(pre<cur)
{
total-=2*pre;
total+=cur;
}
else
{
total+=cur;
}
pre=cur;
s++;
}
return total;
}