トピック
ローマ数字には、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;
}
}