Roman to Integer

思路一:用HashMap类,用字符型作为key,其对应的数为value。当一个字符代表的数小于其后一个字符代表的数时,这个数等于后一个字符代表的数减去该字符代表的数,否则等于二者相加。用HashMap是因为不需要思考如何遍历,直接找到Key就行。

class Solution {
public int romanToInt(String s) {
int ans=0;
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 i=0;
while(i<s.length()){
if((i+1<s.length())&&map.get(s.charAt(i+1))>map.get(s.charAt(i))){
ans+=map.get(s.charAt(i+1))-(int)map.get(s.charAt(i));
i+=2;
}
else{
ans+=map.get(s.charAt(i));
i++;
}
}
return ans;
}
}

思路二:暴力求解。因为情况较少,可以直接列举出来。只不过在遇到特殊值的时候需要进一步判断。结果:打败了100%java用户。

class Solution {
public int romanToInt(String s) {
int ans=0;
int i=0;
while(i<s.length()){
switch(s.charAt(i)){
case 'I':
ans+=1;
if((i+1<s.length())&&(s.charAt(i+1)=='V'||s.charAt(i+1)=='X')){
ans+=s.charAt(i+1)=='V'?3:8;
i++;
}
i++;
break;
case 'V':
ans+=5;
i++;
break;
case 'X':
ans+=10;
if((i+1<s.length())&&(s.charAt(i+1)=='L'||s.charAt(i+1)=='C')){
ans+=s.charAt(i+1)=='L'?30:80;
i++;
}
i++;
break;
case 'L':
ans+=50;
i++;
break;
case 'C':
ans+=100;
if((i+1<s.length())&&(s.charAt(i+1)=='D'||s.charAt(i+1)=='M')){
ans+=s.charAt(i+1)=='D'?300:800;
i++;
}
i++;
break;
case 'D':
ans+=500;
i++;
break;
case 'M':
ans+=1000;
i++;
break;
}
}
return ans;
}
}

小结:Integer to Roman和Roman to Integer这两题涉及的情况都比较少,用暴力求解法求解速度也可以很快。

posted @ 2019-10-18 03:42  xbc121  阅读(334)  评论(0编辑  收藏  举报