根据题意,存在6种特殊情况,加上原本的7中,即如下所示:
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
IV 4
IX 9
XL 40
XC 90
CD 400
CM 900
对字符串进行转换,转化为字节数组,然后进行遍历累加值。规则固定了,例如当前值为I,后值为V时,产生特殊情况,结果为4,转换下即为3+1,其他毅如此,转换后如下所示:
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
IV 4 1+3
IX 9 1+8
XL 40 10+30
XC 90 10+80
CD 400 100+300
CM 900 100+800
然后开始编写代码,只需不停循环并累加对应值即可,特殊情况进行判断,单字节时可以直接使用map获取值,代码如下:
class Solution {
public int romanToInt(String s) {
int result = 0;
char[] array = s.toCharArray();
char temp = '0';//临时值
Map<Character, Integer> map = new HashMap<Character, Integer>();
map.put('I', 1);
map.put('V', 5);
map.put('X', 10);
map.put('L', 50);
map.put('C', 100);
map.put('D', 500);
map.put('M', 1000);
for(char arr:array){
if(temp=='I'){
if(arr=='V'){
result += 3;
temp = '0';
}else if(arr=='X'){
result += 8;
temp = '0';
}else{
result += map.get(arr);
temp = arr;
}
}else if(temp=='X'){
if(arr=='L'){
result += 30;
temp = '0';
}else if(arr=='C'){
result += 80;
temp = '0';
}else{
result += map.get(arr);
temp = arr;
}
}else if(temp=='C'){
if(arr=='D'){
result += 300;
temp = '0';
}else if(arr=='M'){
result += 800;
temp = '0';
}else{
result += map.get(arr);
temp = arr;
}
}else{
result += map.get(arr);
temp = arr;
}
}
return result;
}
}
此种情况因为使用到了hashmap,会消耗较多的内存和时间,可看到
result += map.get(arr);
temp = arr;
的部分即为获取单字节值,提取所有此部分值,使用boolean判断,使用switch case来取值,能提高效率,优化后代码如下:
class Solution {
public int romanToInt(String s) {
int result = 0;
char[] array = s.toCharArray();
char temp = '0';//临时值
boolean flg = false;
for(char arr:array){
if(temp=='I'){
if(arr=='V'){
result += 3;
temp = '0';
}else if(arr=='X'){
result += 8;
temp = '0';
}else{
flg = true;
}
}else if(temp=='X'){
if(arr=='L'){
result += 30;
temp = '0';
}else if(arr=='C'){
result += 80;
temp = '0';
}else{
flg = true;
}
}else if(temp=='C'){
if(arr=='D'){
result += 300;
temp = '0';
}else if(arr=='M'){
result += 800;
temp = '0';
}else{
flg = true;
}
}else{
flg = true;
}
if(flg){
switch (arr) {
case 'I':
result += 1;
break;
case 'V':
result += 5;
break;
case 'X':
result += 10;
break;
case 'L':
result += 50;
break;
case 'C':
result += 100;
break;
case 'D':
result += 500;
break;
default:
result += 1000;
break;
}
temp = arr;
flg = false;
}
}
return result;
}
}
备注:此处因为存在7个值,并且每个值的取值概率一样,所以使用switch case,而不使用if else。