1.题目描述
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
2.我的分析思路
罗马数字转成阿拉伯数字,这里面需要知道罗马数字的构成规则。罗马数字通过7个不同字母的重复或组合,能够表示出所有正整数(罗马数字中没有0)。
- I = 1
- V = 5
- X = 10
- L = 50
- C = 100
- D = 500
- M = 1000
比如:IV表示4,VI表示6,XIX表示19,XXI表示21。
可以找到规律,如果左边的字母表示的数字小于右边的字母,则用右边的数字减去左边的数字;反之,则需要进行加法。
我们从左向右进行遍历的时候,不太好计算出最终值;从另一个角度考虑,就是从右向左计算,就可以看出来了。
好了,说到这里,就可以上代码了。
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];
}