题目:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
翻译:把罗马转为数字
思路:如果是单纯的一个罗马字母比较好处理,但是对于4,9这样的,应该看它下一个字符代表的数字是不是比他大,要是大的话减去当前的字符代表的数字。要是小的话,则加上这个数字。
像IV ,代表4.当读到I的时候,应该判断下一个字符V和I的关系,V比I代表的数字大,所以此时应该加上V – I的值,然后指针跳过2.
代码1:
public static int romanToInt(String s) {
int num = 0;
String roman[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
int number[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
int i = 0; int len = s.length();
while(i < s.length())
{
if(i<s.length()-1&&(C2N(s.charAt(i))<C2N(s.charAt(i+1))))//@ 1
{
num+=C2N(s.charAt(i+1))-C2N(s.charAt(i));
i+=2;
}
else
{
num +=C2N(s.charAt(i));
i++;
}
}
return num;
}
public static int C2N(char c)
{
switch (c) {
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: throw new NumberFormatException(
"Error");
}
}
在@1的地方,最初写的时候两个判断条件反着写。结果报错说是越界。后来找了一会才发现。
因为在&&判断的时候,如果前面的为假,后面可以直接跳过,但是如果前面已经报错,那后面的条件也不会看直接跳错。
又是细节的问题。唉
代码2:
public int romanToInt(String s) {
int num = 0;
String roman[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
int number[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
int i = 0;
while(i<=s.length()-1)
{
switch(s.charAt(i))
{
case 'I':
if(i <s.length()-1&&(s.charAt(i+1)=='V'||s.charAt(i+1)=='X'))
num -=1;
else
num += 1;
break;
case 'V':
num +=5;
break;
case 'X':
if(i < s.length()-1&&(s.charAt(i+1)=='L'||s.charAt(i+1)=='C'))
num -=10;
else
num+=10;
break;
case 'L':
num +=50;
break;
case 'C':
if(i < s.length()-1&&(s.charAt(i+1)=='D'||s.charAt(i+1)=='M'))
num -=100;
else num+=100;
break;
case 'D':
num+=500;
break;
case 'M':
num+=1000;
break;
}
i++;
}
return num;
}
直接把函数整合在一起的写法。看起来不是太简介。还是分开写成函数比较舒服。