leetcode Roman to Integer java基本编程学习(四)

一. 题目      
      Given a roman numeral, convert it to an integer.
      Input is guaranteed to be within the range from 1 to 3999.
二. 罗马数字学习  https://zh.wikipedia.org/wiki/%E7%BD%97%E9%A9%AC%E6%95%B0%E5%AD%97

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

  1> 罗马数字中没有0;

  2>左减右加 

    左减有限制的:

             微笑 仅限于I、X、C。比如45不可以写成VL,只能是XLV;   

              微笑 左减时不可跨越一个位数,   比如,99不可以用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1])表示;

                                                                      999不能写成IM(1000-1)表示,而是用CMXCIX( [1000-100] + [100-10] +[10-1] )表示; 

              微笑 左减数字必须为一位,比如8写成VIII,而非IIX。

  3>数码限制: 同一数码最多只能出现三次,如40不可表示为XXXX,而要表示为XL。

  

三. 代码   
public class Solution {
    public int romanToInt(String s) {
        //首先保证s肯定是有字符串存在的
        if(s==null || s.length()<=0 || s.trim().length()<=0)
            return 0;
        
         int res = 0;
         int data;
         char ch;
         for(int i=0; i< s.length(); i++){ 
             ch = s.charAt(i);
             switch(s.charAt(i)){
                 case 'I':
                    //当I的右边是V或X是才进行减操作,否则进行加,减1的源码是因为每次要和后面相邻的字符进行比较/ 
                     if(i< s.length()-1 && (s.charAt(i+1)=='V' || s.charAt(i+1)=='X')){ 
                        res-=1;
                     }else
                       res+=1;   //如果最后一位等于I,则这里也进行了处理+1.
                     break;
                case 'V':
                    if(i< s.length()){   //注意这里比较上面没有-1操作
                       res+=5;
                    } 
                    break;
                case 'X':
                    if(i< s.length()-1&&(s.charAt(i+1)=='L'||s.charAt(i+1)=='C')){
                       res-=10;
                    }else
                       res+=10;
                    break;
                case 'L':
                    if(i< s.length()){
                       res+=50;
                    }
                    break;
                case 'C':
                     if(i< s.length()-1 &&(s.charAt(i+1)=='D'||s.charAt(i+1)=='M')){
                        res-=100;
                     }else
                        res+=100;
                    break;
                case 'D':
                    if(i< s.length())
                       res+=500;
                    break;
                case 'M':
                   if(i< s.length())
                       res+=1000;
                   break;
                default:      //保证代码的完整性,万一不是这些字母呢,是吧。
                   return 0;
             }
             
         }
         return res;
    }
}

   


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值