罗马数字转整数的两种思路方法及其JAVA代码实现

package day04;
/*
    罗马数字包含以下七种字符: I, V, X, L,  C,  D 和   M。
                          1, 5,  10,50,100,   500   1000

    I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
    X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
    C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

 */
public class RomanToInt {
    public static void main(String[] args) {
        String s = "IV";//1994-->M 1000 + CM 900 + XC 90 + IV 4
        //测试思路1
        //int res = romanToInt(s);
        //测试思路2
        int res = romanToInt02(s);
        System.out.println(res);
    }
    //                                      1  4  5  9  10 40 50 90 100  400 500     900   1000
    //思路1:从后往前扫描字符串,判断所有可能是情况:I、IV、V、IX、X、XL、L、XC、C、  CD、  D、   CM、   M
    public static int romanToInt(String s) {
        int sum = 0;
        //从后往前遍历字符串
        for(int i = s.length() - 1; i >= 0;) {

            //处理I,因为所有的IV、IX中的I都会被跳过
            if (s.charAt(i) == 'I') {
                sum += 1;
                i -= 1;
                continue;
            }

            //IV
            if(s.charAt(i) == 'V' && (i - 1) >= 0 && s.charAt(i - 1) == 'I') {
                sum += 4;
                i -= 2;
                continue;
            }
            //V
            if (s.charAt(i) == 'V' &&(i == 0 || s.charAt(i - 1) != 'I')) {
                sum += 5;
                i -= 1;
                continue;
            }

            //IX
            if(s.charAt(i) == 'X' && (i - 1) >= 0 && s.charAt(i - 1) == 'I') {
                sum += 9;
                i -= 2;
                continue;
            }
            //X
            if (s.charAt(i) == 'X' &&(i == 0 || s.charAt(i - 1) != 'I')) {
                sum += 10;
                i -= 1;
                continue;
            }
            //XL
            if(s.charAt(i) == 'L' && (i - 1) >= 0 && s.charAt(i - 1) == 'X') {
                sum += 40;
                i -= 2;
                continue;
            }
            //L
            if (s.charAt(i) == 'L' &&(i == 0 || s.charAt(i - 1) != 'X')) {
                sum += 50;
                i -= 1;
                continue;
            }
            //XC
            if(s.charAt(i) == 'C' && (i - 1) >= 0 && s.charAt(i - 1) == 'X') {
                sum += 90;
                i -= 2;
                continue;
            }
            //C
            if (s.charAt(i) == 'C' &&(i == 0 || s.charAt(i - 1) != 'X')) {
                sum += 100;
                i -= 1;
                continue;
            }
            //CD 400
            if(s.charAt(i) == 'D' && (i - 1) >= 0 && s.charAt(i - 1) == 'C') {
                sum += 400;
                i -= 2;
                continue;
            }
            //D 500
            if (s.charAt(i) == 'D' &&(i == 0 || s.charAt(i - 1) != 'C')) {
                sum += 500;
                i -= 1;
                continue;
            }
            //CM
            if(s.charAt(i) == 'M' && (i - 1) >= 0 && s.charAt(i - 1) == 'C') {
                sum += 900;
                i -= 2;
                continue;
            }
            //M
            if (s.charAt(i) == 'M' &&(i == 0 || s.charAt(i - 1) != 'C')) {
                sum += 1000;
                i -= 1;
                continue;
            }

        }

        return sum;
    }

    //思路2:从前往后扫描,小符号在大符号前,做减法;小符号在大符号后做加法--》IV = 5 - 1, VI = 5 + 1,此时需要一个变量记录前一个符号(数值)
    public static int romanToInt02(String s) {
        int preNum = getValue(s.charAt(0));//记录前一个符号(数值)
        int sum = 0;

        for(int i = 1; i < s.length(); i++) {
            int curNum = getValue(s.charAt(i));

            if(preNum < curNum) {//小符号在大符号前,做减法
                sum -= preNum;
            } else {
                sum += preNum;
            }

            preNum = curNum;
        }
        //处理最后一个preNum
        sum += preNum;

        return sum;
    }
    //根据符号返回相应的数值
    public static int getValue(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;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值