Roman To Integer leetcode java

问题描述:

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

算法:

/**
* 输入一个罗马数字,返回它的整型表示
* @author admin
* 转换规则:从右向左或者从左向右遍历均可
* 1 相同数字连写,相加 ;2 小数字在大数字右边,相加;3 小数字在大数字左边,大的减去小的
*/

方法一:hashmap 从右向左遍历

//将罗马数字转换为整型值
public static int romanToInt(String s){
    HashMap<Character, Integer> roma_weight = new HashMap<Character, Integer>();
    roma_weight.put('I', 1);
    roma_weight.put('V', 5);
    roma_weight.put('X',10);
    roma_weight.put('L', 50);
    roma_weight.put('C', 100);
    roma_weight.put('D',500);
    roma_weight.put('M',1000);
    char[] roma = s.toCharArray(); //将罗马数字转化为字符数组
    int length = roma.length;
    int preValue = 0; //前一步的value
    int value = roma_weight.get(roma[length - 1]) ;// 当前的value

    //从右向左遍历
    for(int i = length - 2; i >= 0 ; i--){
      //小的数字在大数字右边,直接相加
      if( roma_weight.get(roma[i]) >= roma_weight.get(roma[i + 1])) {
        preValue = value;
        value = value + roma_weight.get(roma[i]);
      }
      else { //小的数字在大数字左边,大的减去小的
        value = preValue + roma_weight.get(roma[i + 1]) - roma_weight.get(roma[i]);
      }
    }
    return value;
}

 

方法二:switch case,从左向右遍历

//与第一种方法基本相同,从左向右
public static int romanToInt1(String s) {
  char[] ss = s.toCharArray();
  int ret = toNumber(ss[0]); 
  for (int i = 1; i < ss.length; i++) { 
    if (toNumber(ss[i - 1]) < toNumber(ss[i])) { 
      //ret - toNumber(ss[i - 1]) = preValue; 然后再进行 preValue + toNumber(ss[i]) - toNumber(ss[i - 1]);
      ret += toNumber(ss[i]) - 2 * toNumber(ss[i - 1]);  //相当于方法一中的  preValue + roma_weight.get(roma[i + 1]) - roma_weight.get(roma[i]);
    } else { 
      ret += toNumber(ss[i]); 
     } 
   } 
   return ret; 
}

//罗马数字权重表,没有空间复杂度,较hashmap要好一些
public static int toNumber(char ch) { 
  switch (ch) { 
    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; 
  } 
  return 0; 
}

 

 

posted @ 2015-12-10 10:52  江湖凶险  阅读(206)  评论(0编辑  收藏  举报