首页 > 代码库 > [leetcode]_Roman to Integer

[leetcode]_Roman to Integer

题目:给定一个罗马数字串,转换为一个整数。

一开始没理解,以为是string to int。后来理解:罗马数字与阿拉伯数字的映射关系,见下图:

至此,题目的意思才掌握明白,用程序模拟这张表。

无可置否,需要将这张表的映射关系存进一个map中,对输入的string查找map中的映射关系。

先贴上代码:(注:substring(startIndex,endIndex) 截取的子字符串是从startIndex处到endIndex-1处为止的)

public int romanToInt(String s) {
        Map<String , Integer> roman = new HashMap<String , Integer>();
        roman.put("I" , 1);
        roman.put("IV" , 4);
        roman.put("V" , 5);
        roman.put("IX" , 9);
        roman.put("X" , 10);
        roman.put("XL" , 40);
        roman.put("L" , 50);
        roman.put("XC" , 90);
        roman.put("C" , 100);
        roman.put("CD" , 400);
        roman.put("D" , 500);
        roman.put("CM" , 900);
        roman.put("M" , 1000);
        
        int result = 0;
        int len = s.length();
        for(int i = 0 ; i < len ;){
            if( len - i >= 2) {
                String each = s.substring(i , i + 2);
                if(roman.get(each) != null){
                    result += roman.get(each);
                    i = i + 2;
                    continue;
                }
            }
            String each = s.substring(i , i + 1);
            result += roman.get(each);
            i = i + 1;
        }
        return result;
}

网络上的map很多只存了1,5,10,100,500,1000这几个值,但是需要一个辅助变量来管理,我觉得那样写绕来绕去的,很容易哪里就绕错了。

 

如果像我上面那样存1,4,5,9,10...进map。每次只需先判断两位,

while(遍历整个string){

  if(该两位string在map中存在)

      加上这个map值;

  else(如果该两位string在map中不存在)

      加上第一位string的map值;

}

清晰好理解。真的很好懂。