Leetcode-13 Roman to Integer (java)

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.

题目翻译

将给定的一个罗马数字字符串转换为整数
假定的输入范围是1到3999.

解决思路

这道里面本身很简单,其实难点在于必须要明白罗马数字的标识方法。
罗马数字一共有七个大写字符,分别是:I、V、X、L、C、D、M
下面是罗马字符和整数的对应关系。

罗马字符整数
I1
V5
X10
L50
C100
D500
M1000

罗马字符串的计算规则就是
1、从左向右一次计算。
2、如果一个罗马字符对应的整数比它后面的字符对应的整数小,那么就讲后面的字符对应的整数减去它对应的整数。
如果一个罗马字符对应的整数不小于它后面的字符对应的整数,那么就讲后面的字符对应的整数加上它对应的整数。
下面是一个罗马字符串和整数的对应计算实例

罗马字符串整数
III3
IV4
VI6
IX9
XI11
IL49
LX60
IM999
VM995
XM990
LM950
CM900
DM500
MI1001
MV1005
MX1010
ML1050
MC1100
MD1500
MDCCCLXXXIV1884

代码示例

/**
 * Created by yumodev on 9/12/16.
 */
public class RomanToInteger_13 {
    public static int romanToInt(String s) {
        if (s == null || s.length() == 0){
            return 0;
        }

        int result = 0;
        for (int i = 0; i < s.length();i++){
            char ch = s.charAt(i);
            switch (ch){
                case 'I':{
                    if (i < s.length() -1  && s.charAt(i + 1) != 'I'){
                        result -= 1;
                    }else{
                        result += 1;
                    }
                    break;
                }
                case 'V':{
                    if (i < s.length() -1  && (s.charAt(i + 1) != 'I' && s.charAt(i + 1) != 'V')){
                        result -= 5;
                    }else{
                        result += 5;
                    }
                    break;
                }
                case 'X':{
                    if (i < s.length() -1  && ( s.charAt(i + 1) == 'C' || s.charAt(i + 1) == 'L' || s.charAt(i + 1) == 'M' || s.charAt(i + 1) == 'D')){
                        result -= 10;
                    }else{
                        result += 10;
                    }
                    break;
                }
                case 'L':{
                    if (i < s.length() -1  && ( s.charAt(i + 1) == 'C' || s.charAt(i + 1) == 'M' || s.charAt(i + 1) == 'D')){
                        result -= 50;
                    }else{
                        result += 50;
                    }
                    break;
                }
                case 'C':{
                    if (i < s.length() -1  && (s.charAt(i + 1) == 'M' || s.charAt(i + 1) == 'D')){
                        result -= 100;
                    }else{
                        result += 100;
                    }
                    break;
                }
                case 'D':{
                    if (i < s.length() -1  && s.charAt(i + 1) == 'M'){
                        result -= 500;
                    }else{
                        result += 500;
                    }
                    break;
                }
                case 'M':{
                    result += 1000;
                    break;
                }

            }

        }

        return result;
    }

    public static void main(String[] args) {
        String str = "MDCCCLXXXIV";
        long startTime = System.nanoTime();
        int result = romanToInt(str);
        long endTime = System.nanoTime();
        long time = endTime - startTime;

        System.out.println("romanToInt:" + result + " time:" + time);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值