13. Roman to Integer

题目

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值