Roman to Integer

来源:互联网 发布:js获取class 编辑:程序博客网 时间:2024/06/05 21:12

Given a roman numeral, convert it to an integer.

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



思路:

首先,学习一下罗马数字,参考罗马数字

罗马数字是最古老的数字表示方式,比阿拉伯数组早2000多年,起源于罗马

罗马数字有如下符号:

基本字符IVXLCDM对应阿拉伯数字1510501005001000
计数规则:
  1. 相同的数字连写,所表示的数等于这些数字相加得到的数,例如:III = 3
  2. 小的数字在大的数字右边,所表示的数等于这些数字相加得到的数,例如:VIII = 8
  3. 小的数字,限于(I、X和C)在大的数字左边,所表示的数等于大数减去小数所得的数,例如:IV = 4
  4. 正常使用时,连续的数字重复不得超过三次
  5. 在一个数的上面画横线,表示这个数扩大1000倍(本题只考虑3999以内的数,所以用不到这条规则)

其次,罗马数字转阿拉伯数字规则(仅限于3999以内):

观察规律:从4,9,身上看到规律。IV,IX。只有当前的数字比左边的数字大,则要减去左边的数。否则,一直加。
如何减去左边的数,也就是减去左边的数的两倍然后加上当前数,因为之前已经加过左边的数了。

public class Solution {    public int romanToInt(String s) {        if(s == null) return 0;        int sum = 0;         int pre = 0; int cur = 0;        for(int i=0; i<s.length(); i++){            int val = getNumber(s.charAt(i));            cur = val;            if(cur > pre){                sum = sum - 2* pre + cur;                pre = cur;            } else {                sum = sum + cur;                pre = cur;            }        }        return sum;    }        public int getNumber(char c){        int val = 0;        switch(c){            case 'I': val = 1; break;            case 'V': val = 5; break;            case 'X': val = 10; break;            case 'L': val = 50; break;            case 'C': val = 100; break;            case 'D': val = 500; break;            case 'M': val = 1000; break;        }        return val;    }}


0 0