优化这段代码: public int romanToInt(String s) { int result=0,temp=0,i; for ( i=0; i<s.length();i++){ char c = s.charAt(i); int flag=1; if (i+1>s.length() || i+1==s.length()){ flag=0; } switch (c){ case 'I': if (flag==1 && s.charAt(i+1)=='V'){ temp = 4; i=i+1; break; } else if (flag==1 && s.charAt(i+1)=='X'){ temp = 9; i = i+1; break; } else temp=1; break; case 'V': temp = 5; break; case 'X': if (flag==1 && s.charAt(i+1)=='L'){ temp = 40; i=i+1; break; } else if (flag==1 && s.charAt(i+1)=='C'){ temp = 90; i=i+1; break; } else temp=10; break; case 'L': temp = 50; break; case 'C': if (flag==1 && s.charAt(i+1)=='D'){ temp = 400; i=i+1; break; } else if (flag==1 && s.charAt(i+1)=='M'){ temp = 900; i=i+1; break; } else temp=100; break; case 'D': temp = 500; break; case 'M': temp = 1000; break; } result = result + temp; } return result; }
时间: 2023-05-14 21:06:54 浏览: 163
) { char next = s.charAt(i+1); if (next=='V' || next=='X'){ temp=-1; } } result+=1+temp; temp=0; break; case 'V': result+=5; temp=0; break; case 'X': if (flag==1) { char next = s.charAt(i+1); if (next=='L' || next=='C'){ temp=-10; } } result+=10+temp; temp=0; break; case 'L': result+=50; temp=0; break; case 'C': if (flag==1) { char next = s.charAt(i+1); if (next=='D' || next=='M'){ temp=-100; } } result+=100+temp; temp=0; break; case 'D': result+=500; temp=0; break; case 'M': result+=1000; temp=0; break; } } return result; }
可以使用 HashMap 来存储罗马数字和阿拉伯数字的对应关系,避免使用 switch 语句,同时可以减少一些重复代码。代码如下:
public int romanToInt(String s) {
Map<Character, Integer> map = new HashMap<>();
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);
int result = 0;
int prev = 0;
for (int i = s.length() - 1; i >= 0; i--) {
int curr = map.get(s.charAt(i));
if (curr < prev) {
result -= curr;
} else {
result += curr;
}
prev = curr;
}
return result;
}
这段代码使用了倒序遍历字符串的方式,每次比较当前字符对应的数字和前一个字符对应的数字的大小关系,如果当前数字小于前一个数字,则减去当前数字,否则加上当前数字。这样可以避免使用 switch 语句,同时也可以减少一些重复代码。
阅读全文