leetcode修炼之路——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)。 按照下面的规则可以表示任意正整数。

重复数次:一个罗马数字重复几次,就表示这个数的几倍。
右加左减:在一个较大的罗马数字的右边记上一个较小的罗马数字,表示大数字加小数字。在一个较大的数字的左边记上一个较小的罗马数字,表示大数字减小数字。
但是,左减不能跨越等级。比如,99不可以用IC表示,用XCIX表示。

加线乘千:在一个罗马数字的上方加上一条横线或者在右下方写M,表示将这个数字乘以1000,即是原数的1000倍。同理,如果上方有两条横线,
 即是原数的1000000倍。

代码实现:

public static int romanToInt(String s) {

        char[] cs = s.toCharArray();// 变成char数组
        int result = 0;
        for (int i = 0; i < cs.length; i++) {

            if (i + 1 < cs.length) {
                if (oneRomanToInt(cs[i]) < oneRomanToInt(cs[i + 1])) {// 规则:大的小的在前面为负数
                    result -= oneRomanToInt(cs[i]);
                } else {
                    result += oneRomanToInt(cs[i]);
                }
            } else {// 把最后一个加上
                result += oneRomanToInt(cs[i]);
            }

        }

        return result;
    }

    public static int oneRomanToInt(char c) {// 罗马数字转换
        switch (c) {
        case 'I':
            return 1;
        case 'V':
            return 5;
        case 'X':
            return 10;
        case 'L':
            return 50;
        case 'C':
            return 100;
        case 'D':
            return 500;
        case 'M':
            return 1000;
        default:
            return 0;
        }
    }

总体来说这个比较简单,但是要注意小数在大数前面是负数!!!

posted @ 2016-08-17 23:10  风起云涌,勿忘本心  阅读(165)  评论(0编辑  收藏  举报