【刷题笔记10.2】LeetCode: 罗马数字转整数

LeetCode: 罗马数字转整数

一、题目描述

【刷题笔记10.2】LeetCode: 罗马数字转整数_第1张图片

二、分析

方法一:
将给定字符串s中的"IV", “IX”, “XL”, “XC”, “CD”, “CM” 全部替换为其他字符如:a, b, c, d, e, f 这种,然后就可以遍历累加了。

        s = s.replace("IV", "a");
        s = s.replace("IX", "b");
        s = s.replace("XL", "c");
        s = s.replace("XC", "d");
        s = s.replace("CD", "e");
        s = s.replace("CM", "f");

方法二:
按照题目的描述,可以总结如下规则:

  • 罗马数字由 I,V,X,L,C,D,M 构成;
  • 当小值在大值的左边,则减小值,如 IV=5-1=4;
  • 当小值在大值的右边,则加小值,如 VI=5+1=6;
  • 由上可知,右值永远为正,因此最后一位必然为正。
    【刷题笔记10.2】LeetCode: 罗马数字转整数_第2张图片

在代码实现上,可以往后看多一位,对比当前位与后一位的大小关系,从而确定当前位是加还是减法。当没有下一位时,做加法即可。

也可保留当前位的值,当遍历到下一位的时,对比保留值与遍历位的大小关系,再确定保留值为加还是减。最后一位做加法即可。

三、上代码

方法一代码如下:

public static int solution2(String s) {
            s = s.replace("IV", "a");
            s = s.replace("IX", "b");
            s = s.replace("XL", "c");
            s = s.replace("XC", "d");
            s = s.replace("CD", "e");
            s = s.replace("CM", "f");

        //System.out.println("1111" + s);

        int result = 0;
        for (int i = 0; i < s.length(); i++) {
            int num = getInt2(s.charAt(i));
            result += num;
        }
        return result;
    }

    public static int getInt2(char x) {
        switch (x) {
            case 'a': return 4;
            case 'b': return 9;
            case 'c': return 40;
            case 'd': return 90;
            case 'e': return 400;
            case 'f': return 900;
            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;
        }
    }

方法二代码如下:

public int solution1(String s) {
        int result = 0;
        int pre = getInt1(s.charAt(0));
        for (int i = 1; i < s.length(); i++) {
            int num = getInt1(s.charAt(i));
            if (pre < num) {
                result -= pre;
            } else {
                result += pre;
            }
            pre = num;
        }
        result += pre;
        return result;
    }

    public int getInt1(char x) {
        switch (x) {
            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;
        }
    }

方法三自己额外想的方法(直观解法):

public int romanToInt(String s) {
        int result = 0;
        for (int i = 0; i < s.length();) {
            if (s.charAt(i) == 'M') {
                result = result + 1000;
                i++;
            } else if (s.charAt(i) == 'D') {
                result = result + 500;
                i++;
            } else if (s.charAt(i) == 'C') {
                if ((i + 1 <= s.length() - 1) && s.charAt(i+1) == 'D') {
                    result = result + 400;
                    i = i + 2;
                } else if ((i + 1 <= s.length() - 1) && s.charAt(i+1) == 'M') {
                    result = result + 900;
                    i = i + 2;
                } else {
                    result = result + 100;
                    i++;
                }
            } else if (s.charAt(i) == 'L') {
                result = result + 50;
                i++;
            } else if (s.charAt(i) == 'X') {
                if ((i + 1 <= s.length() - 1) && s.charAt(i+1) == 'L') {
                    result = result + 40;
                    i = i + 2;
                } else if ((i + 1 <= s.length() - 1) && s.charAt(i+1) == 'C') {
                    result = result + 90;
                    i = i + 2;
                } else {
                    result = result + 10;
                    i++;
                }
            } else if (s.charAt(i) == 'V') {
                result = result + 5;
                i++;
            } else if (s.charAt(i) == 'I') {
                if ((i + 1 <= s.length() - 1) && s.charAt(i+1) == 'V') {
                    result = result + 4;
                    i = i + 2;
                } else if ((i + 1 <= s.length() - 1) && s.charAt(i+1) == 'X') {
                    result = result + 9;
                    i = i + 2;
                } else {
                    result = result + 1;
                    i++;
                }
            }
        }
        return result;
    }

你可能感兴趣的:(笔记,leetcode,linux)