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;
    }
}

  

posted @ 2018-08-24 16:12  非我非非我  阅读(187)  评论(0编辑  收藏  举报