leetcode----------Roman to Integer

题目

Roman to Integer

通过率 34.2%
难度 Easy

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

 

首先来看一下罗马数字的编码规范(转)

  罗马数字,是用7个符号表示所有数字的计数方式。虽然也用了10进制的概念,但不含表示0的符号,而且在编码规则中没有10进制的具体实现,因此表示数字的方法很复杂。

  这7个符号与10进制阿拉伯数字的对应关系是:

    I =1; X=10; C=100;M=1000;

    V=5;L=50;D=500;

  罗马数字编码规则如下:

    1.编码最短,左减右加;

    2.加减不能跨“数量级”;

    3. 减不过1,加不过3;

    4. 上加一条横线表示乘1000,两条横线表示乘1000000....

  上述规则相互制约,编码时要综合考虑。下面举例说明:

    1. 数字4,如果不考虑规则,好像可以写成IIII,但编码不是最短的,用规则1,表示为IV,即5-1=4;

    2. 数字8,如果只用左减右加原则,似乎应该写成IIX,但是因为规则3,应该写成VIII;

    3. 数字9,如果只用左减右加原则,好像可写成VIIII,但因为编码最短原则,应该写成IX;

    4. 数字49,如果用原则1,似乎应该写成IL,但因为规则2,应该写成XLIX;

    5. 数字99,如果用原则1,似乎应该写成IC,但因为规则2,应该写成XCIX;

 

 思路:从前往后扫描,用一个临时变量记录分段数字。

如果当前处理的字符对应的值和上一个字符一样,那么临时变量加上这个字符。 
如果当前比前一个大,说明这一段的值应该是当前这个值减去前面记录下的临时变量中的值。 
如果当前比前一个小,那么就可以先将临时变量的值加到结果中,然后开始下一段记录。

 

java代码:

 

public class Solution {
    public int romanToInt(String s) {
        if(s.length()<1) return 0;
        int result=0;
        int sub=getRomanValue(s.charAt(0));
        int lastv=sub;
        for(int i=1;i<s.length();i++){
            char curc=s.charAt(i);
            int curv=getRomanValue(curc);
            if(curv==lastv){
                sub += curv;
            }else if(curv<lastv){
                result += sub;
                sub=curv;
            }else{
                sub =curv-sub;
            }
            lastv=curv;
        }
        result += sub;
        return result;
    }
    
    public int getRomanValue(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 @ 2014-12-24 22:01  pku_min  阅读(172)  评论(0)    收藏  举报