zoukankan      html  css  js  c++  java
  • leetcode-13. Roman to Integer

    思路:首先是本弱鸡的弱鸡思路
    1、将所有的组合放入Map中,key值代表罗马数字,value代表罗马数字对应的整数值
    2、每次取两个值进行判断,如果匹配直接跳两个继续匹配,否则取一个进行匹配
    ps:这样做的缺点就是,无法判断输入的数字是否是罗马数字,而且判断比较繁琐,
    对于此题,题目中未让判断输入是否是罗马数字

    class Solution {
        public int romanToInt(String s) {
            Map<String,Integer> resultMap = new HashMap<String, Integer>();
            resultMap.put("I",1);
            resultMap.put("V",5);
            resultMap.put("X",10);
            resultMap.put("L",50);
            resultMap.put("C",100);
            resultMap.put("D",500);
            resultMap.put("M",1000);
            resultMap.put("IV",4);
            resultMap.put("IX",9);
            resultMap.put("XL",40);
            resultMap.put("XC",90);
            resultMap.put("CD",400);
            resultMap.put("CM",900);
    
            int len = s.length();
            int result = 0;
            //长度为1直接匹配
            if(len==1){
                result += resultMap.get(s);
    //            System.out.println(result);
                return result;
            }
            if(len==2){
                //长度为2直接匹配
                if(resultMap.containsKey(s)){
                    result += resultMap.get(s);
    //                System.out.println(result);
                    return result;
                }else {
                    //两个分别匹配
                    result += resultMap.get(s.substring(0,1));
                    result += resultMap.get(s.substring(1,2));
    //                System.out.println(result);
                    return result;
                }
            }
    
            String flag = "";
            int strstart = 0;  //用来判断最后单独判断的值的开始位置,(当倒数第二三个两个可以匹配时,最后剩下一个数需要判断,否则两个)
            //到这里的都是长度>=3的,然后我们循环0 --- len-2 的值(因为下边的判断有i+2,可能会造成数组越界)
            for(int i=0;i<len-2;i++){
                flag = s.substring(i,i+2);//先判断两个的组合看是否匹配,不匹配则再尝试一个的
                if(resultMap.containsKey(flag)){
                    result += resultMap.get(flag);
                    i=i+1;  //如果两个的匹配了,i需要+1
                    strstart = i+1;
                }else{
                    flag = s.substring(i,i+1);
                    result += resultMap.get(flag);
                    strstart = i+1;
                }
            }
            //取最后剩下的值进行判断
            String str2end = s.substring(strstart,len);
            if(resultMap.containsKey(str2end)){
                result += resultMap.get(str2end);
    //            System.out.println(result);
                return result;
            }else {
                result += resultMap.get(str2end.substring(0,1));
                result += resultMap.get(str2end.substring(1,2));
    //            System.out.println(result);
                return result;
            }
        }
    }
    

      

    大神思路:
    参考:https://www.cnblogs.com/grandyang/p/4120857.html
    首先是罗马数字的规则
    1、基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。
    2、不能把基本数字V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。
    3、V 和X 左边的小数字只能用Ⅰ。
    4、L 和C 左边的小数字只能用X。
    5、D 和M 左边的小数字只能用C。

    然后是解法:
    根据规则可以分析到
    1、两个数的组合AB,要加上B减去A。单个数字直接加上就可以
    2、如果是两个数字的组合,则当前数字的后一个数字一定是大于当前数字的,所以当当前数字的后一个数字小于当前数字时
    加上当前数字即可
    3、最后一个数字因为没有后一位数字,所以单独判断。最后一位数字直接加上即可。
    总结:
    1、如果当前数字是最后一个数字,或者之后的数字比它小的话,则加上当前数字
    2、其他情况则减去这个数字

    class Solution{
        public int romanToInt(String s) {
            int result = 0;
            char[] ch = s.toCharArray();
            Map<String,Integer> resultMap = new HashMap<String, Integer>();
            resultMap.put("I",1);
            resultMap.put("V",5);
            resultMap.put("X",10);
            resultMap.put("L",50);
            resultMap.put("C",100);
            resultMap.put("D",500);
            resultMap.put("M",1000);
    
            for(int i=0;i<ch.length-1;i++){
                int ans1 = resultMap.get(ch[i]+"");
                int ans2 = resultMap.get(ch[i+1]+"");
                if(ans1>=ans2){
                    result += ans1;
                }else {
                    result -= ans1;
                }
            }
            result += resultMap.get(ch[ch.length-1]+"");
            System.out.println(result);
            return result;
        }
    }
    

      

  • 相关阅读:
    xshel链接linuxl安装nginx
    nginx学习笔记
    sweiper做一个tab切换
    bootstrap中tab切换的使用
    pc页面自动缩放到手机端
    日程表
    页面嵌套iframe时,怎样让iframe高度根据自身内容高度自适应
    mysql5.7版本以上下载安装
    电脑快捷键操作汇总
    关于.eslintrc.js代码检测的一些配置
  • 原文地址:https://www.cnblogs.com/tonghao/p/9530489.html
Copyright © 2011-2022 走看看