[アルゴリズムソリューション] LeetCode13。ローマ数字から整数へ

トピック

ローマ数字には、I、V、X、L、C、D、Mの7文字が含まれています。
文字値
I 1
V 5
X 10
L 50
C 100
500 D
M 1000は、
たとえば、ローマ数字2は、二つの平行なものを意味II、として書かれている。図12に示すXII、として書かれている手段X + II。27はXXVII、つまりXX + V + IIと表記されます。

通常、ローマ数字の小さい数字は大きい数字の右側にあります。ただし、特殊なケースがあります。たとえば、4はIIIIとしてではなく、IVとして記述されます。番号1は番号5の左側にあり、表されている番号は、大きい番号5から番号1を引いた番号4と同じです。同様に、番号9はIXとして表されます。この特別なルールは、次の6つの状況にのみ適用されます。

V(5)とX(10)の左側に配置して、4と9を表すことができます。
XはL(50)とC(100)の左側に配置して、40と90を表すことができます。 
CはD(500)とM(1000)の左側に配置して、400と900を表すことができます。
ローマ数字が与えられたら、それを整数に変換します。入力が1〜3999の範囲にあることを確認してください。

ソース:LeetCode
リンク:https ://leetcode-cn.com/problems/roman-to-integer

解決策1

7つの1文字の数字に加えて、6つの2文字の数字があります。これらの13の状況をマップで維持します。ローマ数字をトラバースするには、最初にマップで2文字に基づいて判断します。そうでない場合は、1文字に基づいて判断します。

class Solution {
    public int romanToInt(String s) {
        Map<String,Integer> numMap = new HashMap<String,Integer>(16);
        numMap.put("M",1000);
        numMap.put("CM",900);
        numMap.put("D",500);
        numMap.put("CD",400);
        numMap.put("C",100);
        numMap.put("XC",90);
        numMap.put("L",50);
        numMap.put("XL",40);
        numMap.put("X",10);
        numMap.put("IX",9);
        numMap.put("V",5);
        numMap.put("IV",4);
        numMap.put("I",1);

        int result = 0;
        for(int i = 0; i < s.length(); i++) {
            if(i < s.length() -1 && numMap.containsKey(s.substring(i,i + 2))) {
                result += numMap.get(s.substring(i,i + 2));
                i++;
            } else {
                result += numMap.get(s.substring(i,i + 1));
            }
        }
        return result;
    }
}

解決策2

文字ごとに判断し、それぞれの結果を合計します。前の文字が現在の文字よりも小さい場合は、前の文字が2回追加されていることを意味し、前の文字コードの数を2回減算する必要があります。

class Solution {
    public int romanToInt(String s) {
        int result = 0,prev = 1001;
        for(int i = 0; i < s.length(); i++) {
            int num = getValue(s.charAt(i));
            result += num;
            if(num > prev) {
                result -= 2 * prev;
            }
            prev = num;
        }
        return result;
    }

    public 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;
        }
        return 0;
    }
}

おすすめ

転載: blog.csdn.net/vxzhg/article/details/106673540