zoukankan      html  css  js  c++  java
  • 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; 
    }
    
     
  • 相关阅读:
    CCNET的部分配置使用说明
    用Visual C++实现PDF文件的显示
    开发流程中的可用性
    TCP/IP学习笔记(一)
    使用 Microsoft 实时通信 API 增强多客户端通信
    TCP/IP学习笔记(二)IP网际协议
    DDE热链接
    软件设计中的可用性
    封包技术
    使用MFC开发ActiveX控件
  • 原文地址:https://www.cnblogs.com/mydesky2012/p/5035241.html
Copyright © 2011-2022 走看看