13. Roman to Integer

来源:互联网 发布:西安地税网络在线发票 编辑:程序博客网 时间:2024/05/19 21:59

题目

Given a roman numeral, convert it to an integer.

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

思路:

在看到题目之后就去查了一下罗马数字的转换规则,发现规则如下:

一、七个基本数字

I :1        
V:5           
X:10      
L:50   
C :100      
D:500         
M:1000

二、构成规则
罗马数字无表示零的数。
表示数的基本方法:除I、X、C位于大数后作为加数,位于大数前作为减数外,一般把若干罗马基本数字写在一起,它表示的数字等于各个数字的和。
1.重写:   III(3)      XX(20)     CC(200)   
2.左减:   IX(9)      XL(40)     CD(400) 
3.右加:   VII(7)     XI(11)      LX(60)
4.综合前三种方法:XLY(L-X+V,45)   LXII(L+X+I+I,62) 

因此想到用HashMap的方式构建罗马数字与其代表的数字之间的对应规则【注意Map构建时要写成Integer,而不是int,犯了这种概念错误第一次当然会编译不过,囧】

之后从前向后遍历字符串,按照规则将其转换成数字:当后一个数字小于前一个数字时,将后一个数字加到结果中;当后一个数字大于前一个数字时,将前一个数字减去一遍(因为之前将它加上了),再加上(后数-前数),即减去前一个数的两倍再加上后一个数。


代码如下:

public class Solution {    public int romanToInt(String s) {        int length = s.length();        //处理空字符串的情况        if(length == 0 || s == null){return -1;}                //构建Map映射关系        HashMap<Character, Integer> romanToInt = new HashMap<Character, Integer>();        romanToInt.put('I',1);        romanToInt.put('V',5);        romanToInt.put('X',10);        romanToInt.put('L',50);        romanToInt.put('C',100);        romanToInt.put('D',500);        romanToInt.put('M',1000);                /*罗马数字规则,右加左减         *在一个较大的罗马数字的右边记上一个较小的罗马数字,表示大数字加小数字。         *在一个较大的罗马数字的左边记上一个较小的罗马数字,表示大数字减小数字。        */        /*从前往后遍历罗马数字,如果某个数比前一个数小,则把该数加入到结果中;反之,则在结果中两次减去前一个数并加上当前这个数;*/        int i;        int num = romanToInt.get(s.charAt(0));        for(i = 1; i < length; i++){            int cur = romanToInt.get(s.charAt(i));            int pre = romanToInt.get(s.charAt(i-1));            if(cur <= pre){                num += cur;            }else{                num = num - pre -pre + cur;            }        }        return num;    }}


【注】

在discuss中看到从后向前遍历的方式,好像更简单,下一个再做的时候试着再用那个方法。

0 0
原创粉丝点击