1.題目描述
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
2.我的分析思路
羅馬數(shù)字轉(zhuǎn)成阿拉伯數(shù)字,這里面需要知道羅馬數(shù)字的構(gòu)成規(guī)則讹剔。羅馬數(shù)字通過7個不同字母的重復或組合压语,能夠表示出所有正整數(shù)(羅馬數(shù)字中沒有0)莺奸。
- I = 1
- V = 5
- X = 10
- L = 50
- C = 100
- D = 500
- M = 1000
比如:IV表示4,VI表示6,XIX表示19跺撼,XXI表示21。
可以找到規(guī)律讨彼,如果左邊的字母表示的數(shù)字小于右邊的字母歉井,則用右邊的數(shù)字減去左邊的數(shù)字;反之哈误,則需要進行加法哩至。
我們從左向右進行遍歷的時候躏嚎,不太好計算出最終值;從另一個角度考慮菩貌,就是從右向左計算卢佣,就可以看出來了。
好了箭阶,說到這里虚茶,就可以上代碼了。
private static Map<Character, Integer> map = new HashMap() {
{
put('I', 1);
put('V', 5);
put('X', 10);
put('L', 50);
put('C', 100);
put('D', 500);
put('M', 1000);
}
};
public static int romanToInt(String s) {
int length = s.length();
int result = 0;
int preVal = 0;
for (int i = length - 1; i >= 0; i--) {
char key = s.charAt(i);
int value = map.get(key);
if (value >= preVal) {
result += value;
} else {
result -= value;
}
preVal = value;
}
return result;
}
3.其他的思路
找到一個比較容易理解的仇参,分享給大家嘹叫。
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];
}