算法练习:罗马数字转整数
解法一:
先在字符串中计算特殊的情况(即小的值在左边的时候),然后在字符串中用空字符串替换掉特殊的字符串,后面再去遍历整个字符串,计算最终的结果。(这个是我自己刚开始的思路,内存和时间消耗都很大)
class Solution {
public int romanToInt(String s) {
int res = 0;
while(s.contains("IX")||s.contains("IV")||s.contains("XL")||
s.contains("XC")||s.contains("CD")||s.contains("CM")){
if(s.contains("IX")) {
s = s.replaceFirst("IX","");
res = res+9;
}
if(s.contains("IV")){
s = s.replaceFirst("IV","");
res = res+4;
};
if(s.contains("XL")){
s = s.replaceFirst("XL","");
res = res+40;
}
if(s.contains("XC")) {
s = s.replaceFirst("XC","");
res = res+90;
}
if(s.contains("CD")) {
s = s.replaceFirst("CD", "");
res = res+400;
}
if(s.contains("CM")) {
s = s.replaceFirst("CM","");
res = res+900;
}
}
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (c){
case 'I':
res = res + 1;
break;
case 'V':
res = res + 5;
break;
case 'X':
res = res + 10;
break;
case 'L':
res = res + 50;
break;
case 'C':
res = res + 100;
break;
case 'D':
res = res + 500;
break;
case 'M':
res = res + 1000;
}
}
return res ;
}
}
解法二:
直接去遍历字符串,用当前位去与下一位做比较,如果小的在大的右边,则小的那个为正数,反之,为负数。(运算速度和内存消耗显著优化)
class Solution {
public int romanToInt(String s) {
int sum = 0;
int pre = getValue(s.charAt(0));
for (int i = 1; i < s.length(); i++) {
if(pre >= getValue(s.charAt(i))){
sum += pre;
}else{
sum -= pre;
}
pre = getValue(s.charAt(i));
}
sum += pre;
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;
}
}
}