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.

题目就这么简洁,没有然后了..

所以,还需要知道由罗马数字转换成阿拉伯数字的转换方法:

1.罗马数字的组成主要是7个字母的组合:

‘I’代表1,‘V’代表5,‘X’代表10,‘L’代表50,‘C’代表100,‘D’代表500,‘M’代表1000;

2.如果左边的数字比右边的数字小,则计算方法为右边的数字减去左边的数字,反之则相加;

3.并且相同的字母不会连续出现3次以上;

知道规则以后,可以开始写代码了,首先判断异常条件,然后初始化map,将7个字母与数字的映射关系存到map中,如果是普通的初始化map,需要写7条map.put(key,value);比较麻烦,刚学了一种优雅(^_^)的写法,虽然并没有简化多少吧==初始化完map,接下来将运算规则转换成代码即可,用map.get(s.charAt(i))得到每个字母对应的数字,然后去比较相邻两个字母对应的数字大小即可,代码如下:

       if(s.length()==0||s==null){
    	   return -1;
       }
       //初始化map
       Map<Character,Integer> map = new HashMap<Character,Integer>(){
    	   {
    		   put('I', 1);
    		   put('V', 5);
    		   put('X', 10);
    		   put('L', 50);
    		   put('C', 100);
    		   put('D', 500);
    		   put('M', 1000);
    	   }
       };
       int len = s.length();
       //int res = map.get(s.charAt(len-1));
       int res = 0;
       for(int i=0;i<len-1;i++){
    	   if(map.get(s.charAt(i))>=map.get(s.charAt(i+1))){
    		   res += map.get(s.charAt(i));
    	   }
    	   else res -= map.get(s.charAt(i));
       }
       return res+map.get(s.charAt(len-1));


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值