解题思路
13. 罗马数字转整数
遍历字符串每一个字符,遇到相应的字符就加对应的数值,但需要注意题目所给出的六种特殊情况,所以要用一个字符变量记录当前字符的前一个字符,二者组合是否符合六种特殊情况,属于就加特殊的数值,不然就加正常的数值。
代码
方法一:
class Solution {
public static int romanToInt(String s) {
int result =0;
char curr_c =' ', prev_c = ' '; //当前字符和前一个字符
for(int i=0 ; i<s.length() ; i++) {
curr_c=s.charAt(i);
if(i!=0) {
prev_c = s.charAt(i-1);
}
switch(curr_c) {
case 'I':
result +=1;
break;
case 'V':
if(prev_c == 'I') {
result = result + 4-1;//减一的原因是前面 I 作为单独的字符加了1
}else {
result +=5;
}
break;
case 'X':
if(prev_c == 'I') {
result = result +9-1;
}else {
result +=10;
}
break;
case 'L':
if(prev_c == 'X') {
result = result +40-10;
}else {
result +=50;
}
break;
case 'C':
if(prev_c == 'X') {
result = result + 90-10;
}else {
result += 100;
}
break;
case 'D':
if(prev_c =='C') {
result = result +400-100;
}else {
result +=500;
}
break;
case 'M':
if(prev_c == 'C') {
result = result +900-100;
}else {
result += 1000;
}
break;
}
}
return result;
}
}
方法二:
class Solution {
public static int romanToInt(String s) {
//把六种特殊情况进行替换,后面统一处理
s = s.replace("IV","a");
s = s.replace("IX","b");
s = s.replace("XL","c");
s = s.replace("XC","d");
s = s.replace("CD","e");
s = s.replace("CM","f");
int result = 0;
for (int i=0; i<s.length(); i++) {
result += choice(s.charAt(i));
}
return result;
}
public static int choice(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;
case 'a': return 4;
case 'b': return 9;
case 'c': return 40;
case 'd': return 90;
case 'e': return 400;
case 'f': return 900;
}
return 0;
}
}