Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
Input is guaranteed to be within the range from 1 to 3999.
Hide Tags: Math, String
解题思路:
首先要来了解一下罗马数字表示法,基本字符有7个:I,V,X,L,C,D,M,分别表示1,5,10,50,100,500,1000。
在构成数字的时候,有下列规则:
1、相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ= 3;
2、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ= 8;Ⅻ= 12;
3、小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ=4;Ⅸ=9;
4、正常使用时,连写的数字重复不得超过三次。
样例输入
CXXIII
样例输出:
123
如果你了解了规则的话,很容易可以看出来,只需要比较前后元素的大小,如果前面比后面大或是相等,这两个罗马字母代表的数字就相加;如果前面比后面小,就后面的减去前面的;
代码如下:
public static int romanToInt(String s)
{
int size=s.length();
int i=0;
int b[]=new int[size];
//将阿拉伯数字转换成对应的数字,存放到数组中
while (i<size)
{
switch (s.charAt(i))
{
case 'I':b[i]=1;break;
case 'V':b[i]=5;break;
case 'X':b[i]=10;break;
case 'L':b[i]=50;break;
case 'C':b[i]=100;break;
case 'D':b[i]=500;break;
case 'M':b[i]=1000;break;
}
i++;
}
/**求和计算
* 规律:如果前面的数子大于或等于后面的数组,直接相加,然后进行求和运算
* 如果前面的数字小于后面的数组,先做减运算,然后进行求和运算
* 注意:sum+=b[j]-2*b[j-1] 减去2倍的原因:在遍历的时候,两个大数中间夹
* 个小数,会有重叠的部分。
* 如: 1000 100 1000 :其中1000 100 直接求和,但100 1000时,需要把之前加进来的
* 100减去,因此出现减去2*100
*/
int sum=b[0];
for (int j = 1; j < size; j++)
{
if (b[j-1]<b[j])
{
sum+=b[j]-2*b[j-1];
}
else
{
sum+=b[j];
}
}
return sum;
}