码迷,mamicode.com
首页 > 其他好文 > 详细

#13_罗马数字转整数

时间:2020-03-27 19:58:26      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:情况下   答案   sub   参考   解题思路   diff   new   else   tab   

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_罗马数字转整数

标签:情况下   答案   sub   参考   解题思路   diff   new   else   tab   

原文地址:https://www.cnblogs.com/mdz3201/p/leetcode_13.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!