1.题意
计算罗马数字的值。一共有7+6,13种情况。
2.算法
/
3.分析
根据字符和数字的对应关系求和,减法的6种情况需要考虑i和i+1两位字符。最开始考虑了哈希表,但开始写之后发现其实不用那么麻烦。查了查发现java也有switch语句,直接switch语句就可以。
需要注意的是break是一定要写的,而且break不影响外层的while循环。
4.代码
class Solution {
public int romanToInt(String s) {
int ans = 0;
//IV4 IX9 XL40 XC90 CD400 CM900
int n = s.length();
int i = 0;
while(i < n){
switch(s.charAt(i)){
case 'I':
if(i<n-1 && s.charAt(i+1)=='V'){
ans += 4;
i += 2;
break;
}
else if(i<n-1 && s.charAt(i+1) == 'X'){
ans += 9;
i += 2;
break;
}
else{
ans += 1;
i++;
break;
}
case 'V':
ans += 5;
i++;
break;
case 'X':
if(i<n-1 && s.charAt(i+1) == 'L'){
ans += 40;
i += 2;
break;
}
else if(i<n-1 && s.charAt(i+1) == 'C'){
ans += 90;
i += 2;
break;
}
else{
ans += 10;
i++;
break;
}
case 'L':
ans += 50;
i++;
break;
case 'C':
if(i<n-1 && s.charAt(i+1) == 'D'){
ans += 400;
i += 2;
break;
}
else if(i<n-1 && s.charAt(i+1) == 'M'){
ans += 900;
i += 2;
break;
}
else{
ans += 100;
i++;
break;
}
case 'D':
ans += 500;
i++;
break;
case 'M':
ans += 1000;
i++;
break;
}
// System.out.println(i + " " + ans);
}
return ans;
}
}
5.复杂度:
时间复杂度:O(n)
空间复杂度:O(1)