题目描述
第十二题的逆过程,还是比较简单的。
初次尝试
也是通过从高位开始往下匹配,匹配成功一个,就将这个数加相应的值,然后再匹配下一个字符。需要注意的是,匹配字符的时候,有的字符是两个同时匹配的,所以需要确定先匹配两个还是一个。
public static int romanToInt(String s)
{
int[] nums = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
String[] romans = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
int re = 0;
int i = 0;
a:while (!"".equals(s))
{
for (; i < romans.length; i++)
{
if (s.length()>1)
{
if (romans[i].equals(s.substring(0, 2)))
{
re += nums[i];
s = s.substring(2);
continue a;
}
}
if (romans[i].equals(s.substring(0,1)))
{
re += nums[i];
s = s.substring(1);
continue a;
}
}
}
return re;
}
有点臃肿,主要是判断边界情况。
提交结果
见怪不怪了,自己做的效率就那样
大佬思路
我用的是,判断一个或两个字符,是否和罗马数字相等,相等再将数字增加对应的大小。因为有的数字是两个字符,所以需要判断两位或者一位。
但其实,罗马这种数字的构造方法是有讲究的,一般都是前面代表的数,加上后面代表的数,只是一些特例情况,如:900、400、90、40、9、4等,是后面的数减去前面的数,只需要做一些简单的盘判断,然后决定是加还是减,最后得到结果。
代码
public int romanToInt(String s)
{
int sum = 0;
int preNum = getValue(s.charAt(0));
for(int i = 1;i < s.length(); i ++)
{
int num = getValue(s.charAt(i));
if(preNum < num)
{ sum -= preNum; }
else
{ sum += preNum; }
preNum = num;
}
sum += preNum;
return sum;
}
private int getValue(char ch)
{
switch(ch)
{
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;
}
}