zoukankan      html  css  js  c++  java
  • #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;
    

    还不如我的呢

    备注



  • 相关阅读:
    Windows netstat 查看端口、进程占用
    nginx开启gzip
    linux查看内存
    linux查看进程、端口
    linux查看磁盘信息
    vmware克隆一台机器后修改etho
    java对象访问
    学生基本信息管理
    作业09-异常
    博客作业06--图
  • 原文地址:https://www.cnblogs.com/mdz3201/p/leetcode_13.html
Copyright © 2011-2022 走看看