LeetCode( 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. 四个规则:
    a) 相同的数字连写,所表示的数等于这些数字相加得到的数,如VVV表示 15;
    b) 左大右小加:左边的数大右边的数小,所表示的数等于这些数字相加得到的数,如VI表示5+1=6;
    c) 左小右大减:左边的数小右边的数大,所表示的数等于大数减去小数,但这个小的数仅限于I,X,C;但是,这种减不可跨越一个为位数,等同于阿拉伯数字每位都分别表示。比如,99不可以用IC(100-1)表示,而是使用XCIX([100-1][10-1])表示;
    d)在一个数的上面画一条横线,表示这个数增值1000倍;
  3. 如果判断一个罗马数字是不是合理的,上面的规则可能都要考虑到,但此题是指将一个罗马数字转换为整数,就是说罗马数字本身已经是合理的,这样就简单多了,重点是处理好前后两个位置上数的大小关系。
    注意:比较的时候是将前后两位的数进行对比的结果来确认对前面一位数字的运算,最后一位特殊处理,而不是将前面已经计算出的总数的和和后面一位对比。我参照了很多博客,后来借鉴的是http://blog.csdn.net/worldwindjp/article/details/42062711这位的逻辑思想:
    一、判断当前字符是否比next字符小,如果小的话就用下一位字符减去当前位字符后加到最终结果上,此时相当于一次性处理了两个位置
    二、否则,就把当前字符直接加到最终结果上。
  4. 我的代码如下:
 public int romanToInt(String s) {
        char[] arr = s.toCharArray();
        int len = arr.length;
        int result = 0;
        int current = 0;
        int next = 0;
        int i;
        for(i=0;i<len-1;i++){
            current = corrdingNum(arr[i]);
            next = corrdingNum(arr[i+1]);
            if(current >= next){
                result += current;
            }else{
                int temp = next - current;
                result += temp;
                i++;
            }
        }
        if(i != len){
             result += corrdingNum(arr[len-1]);
        }

        return result;
    }
    public int corrdingNum(char c){
        int num = 0;
        switch(c){
                case 'I':
                    num = 1;
                    break;
                case 'V':
                    num = 5;
                    break;
                case 'X':
                    num = 10;
                    break;
                case 'L':
                    num = 50;
                    break;
                case 'C':
                    num = 100;
                    break;
                case 'D':
                    num = 500;
                    break;
                case 'M':
                    num = 1000;
                    break;
            }
        return num;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值