Problem: 13. 罗马数字转整数
思路
使用Map,键值对,针对特殊进行处理
解题过程
1. 先使用Map方法,让罗马数字和整数一一对应
2. 其次就是处理特殊情况,因为I遇到V,就不能按照常规进行相加,而是让V减去I,因为罗马数字的规则是左边是较小数,右边是较大数。 循环遍历,当遇到比后一个数小,那么进行相减,如果比后一个数大,进行相加,每次循环遍历,更新sum的值
逐步进行遍历:以III和IV为例:
III:
- j=1,sum=0,第二位是I,不满足判断条件,相加,sum=0+1=1;
- j=1,sum=1,第三位是I,不满足条件,相加,sum=1+1=2;
- j=1,sum=2,下一位不存在,不满足条件,相加,sum=2+1=3;
- 返回sum=3;
IV:
- j=1,sum=0 ,后一位是V,1<5,所以进行相减sum=0-1=-1;
- j=1,sum=-1,后一位不存在,不满足条件,进行相加,sum=-1+5=4
- 返回sum=4
复杂度
- 时间复杂度: O(n)
Code
class Solution {
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 sum=0;//结果
int pre=0;//前一个
//j:现在的数字
for(int i=s.length()-1;i>=0;i--){
int j=map.get(s.charAt(i));//取出现在的数值
if(j<pre){
//比如IV: I>V 所以V-I=4
//前面的数小,减去前面的数
//反之
sum=sum-j;
}else{
sum=sum+j;
}
pre=j;
}
return sum;
}
}
class Solution {
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 sum=0;
for(int i=0;i<s.length();i++){
int j=map.get(s.charAt(i));//获取当前值对应的整数
}
if(i+1<s.length&&j<map.get(s.charAt(i+1))//前一个和后一个进行比较,如果当前比后一位小
{
sum-=j;
}
else{
sum+=j;
}
}
return sum;
}