#13_罗马数字转整数
Posted mdz3201
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#13_罗马数字转整数相关的知识,希望对你有一定的参考价值。
Category | Difficulty | Likes | Dislikes |
---|---|---|---|
algorithms | Easy (61.07%) | 841 | - |
我的答案
public int romanToInt(String s) {
int res = 0;
for(int i= 0;i<s.length();i++){
switch(s.charAt(i)){
case ‘I‘: {
if(i+1<s.length() && (s.charAt(i+1) == ‘V‘ || s.charAt(i+1) == ‘X‘)){
res-=1;
break;
}
res+=1;
}
break;
case ‘V‘: res+=5;
break;
case ‘X‘:{
if(i+1<s.length() && (s.charAt(i+1) == ‘L‘ || s.charAt(i+1) == ‘C‘)){
res-=10;
break;
}
res+=10;
}
break;
case ‘L‘: res+=50;
break;
case ‘C‘: {
if(i+1<s.length() && (s.charAt(i+1) == ‘D‘ || s.charAt(i+1) == ‘M‘)){
res-=100;
break;
}
res+=100;
}
break;
case ‘D‘: res+=500;
break;
case ‘M‘: res+=1000;
break;
default:
throw new IllegalArgumentException();
}
}
return res;
}
解题思路
- 先不考虑特殊情况,用 swich 判断每个罗马数字
- 在特殊情况下加 if 分支
答案分析
- 太长,可封装
- 考虑到特殊情况时左边比右边小,判断方式可以变一下
public int romanToInt(String s) {
int res = 0;
for(int i=0;i<s.length();i++){
if(i+1<s.length() && (toInt(s.charAt(i))<toInt(s.charAt(i+1)))){
res-=toInt(s.charAt(i));
continue;
}
res+=toInt(s.charAt(i));
}
return res;
}
int toInt(char c){
switch(c){
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:
throw new IllegalArgumentException();
}
}
参考方案
public int romanToInt(String s) {
int res = 0;
HashMap<String,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);
map.put("IV", 4);
map.put("IX", 9);
map.put("XL", 40);
map.put("XC", 90);
map.put("CD", 400);
map.put("CM", 900);
for(int i=0;i<s.length();i++){
if(i+1<s.length() && (map.containsKey(s.substring(i, i+2)))){
res+=map.get(s.substring(i, i+2));
i++;
}else{
res+=map.get(s.substring(i, i+1));
}
}
return res;
还不如我的呢
备注
无
以上是关于#13_罗马数字转整数的主要内容,如果未能解决你的问题,请参考以下文章