题目简述:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
上图:
本题解法:
int retValue(char a)
{
if(a == 'M')
return 1000;
if(a == 'D')
return 500;
if(a == 'C')
return 100;
if(a == 'L')
return 50;
if(a == 'X')
return 10;
if(a == 'V')
return 5;
if(a == 'I')
return 1;
}
int retPra(char a)
{
int ret = 0;
if(a == 'M'){
ret = 7;
goto End;
}
if(a == 'D'){
ret = 6;
goto End;
}
if(a == 'C'){
ret = 5;
goto End;
}
if(a == 'L'){
return 4;
goto End;
}
if(a == 'X'){
ret = 3;
goto End;
}
if(a == 'V'){
ret = 2;
goto End;
}
if(a == 'I'){
ret = 1;
goto End;
}
End :
return ret;
}
class Solution {
public:
int romanToInt(string s) {
int ret = 0;
int s1 = 0, s2 = 0;
for(int i = 0; i < s.length(); i++)
{
s1 = retPra(s[i]);
s2 = retPra(s[i + 1]);
if(s1 < s2)
{
ret += retValue(s[i + 1]) - retValue(s[i]);
i++;
}
else
ret += retValue(s[i]);
}
return ret;
}
};
然后就是再来看一下比较好的解法:
7msJAVA解法
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++实现,有意思的部分就是罗马数字的排列方式了,在下面附的是罗马数字的排列规则:(来自百度)
1-10就是: I II III IV V VI VII VIII IX X .
就是一个I代表一根手指表示1.
两个当然就是2.然后V表示的就是一只手也就是5.
然后放在大数左边的小数是减,如IV是4.
放在大数右边的小数是加如VI是6.
然后X表示两只手也就是10.剩下的就跟阿拉伯数字一样组合起来就好了.
20是XX 30是XXX 因为50是L,所以40是XL.然后60LX 70LXX 80LXXX 100是C.所以90是XC.然后十位和个位组合就好了.再附个表