トピック
I
ローマ数字には、V
、 、X
、L
、C
、D
およびの 7 文字が含まれますM
。
キャラクター | 価値 |
---|---|
私 | 1 |
V | 5 |
バツ | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
たとえば、ローマ数字は、つまり 2 つ並べて2
書かれます。+と書きます。++と書きます。II
1
12
XII
X
II
27
XXVII
XX
V
II
通常、ローマ数字の小さい桁は大きい桁の右側にあります。ただし、と4
書かずに と書くなど特殊な場合もあります。数字は数字の左側にあり、表される数字は大きな数字から数字を減じた値に等しくなります。同様に、数値はとして表されます。IIII
IV
1
5
5
1
4
9
IX
この特定のルールは、次の 6 つの状況にのみ適用されます。
I
V
(5) とX
(10)の左側に配置して、4 と 9 を表すことができます。X
L
(50) とC
(100)の左側に配置して、40 と 90 を表すことができます。C
D
(500) とM
(1000)の左側に配置して、400 と 900 を表すことができます。
与えられたローマ数字を整数に変換します。
分析する
ルールが明確になったら、ルールの特徴を分析します。
特徴 1 :通常は小数在大树
加算右边
する
特徴 2 :小数在大数
はいの場合左边
、上記 6 つの場合を判断して減算します。
n
前者をm
例に挙げると、上記の特徴分析から、隣り合う 2 つの数字が減少している場合は ( n>m
= ) を追加して増加し、 n+m
6 つの状況を満たすかどうかを判断します。6 つの状況の共通の特徴は、「はい」と「m
はいn
」です。回、この場合 ( = )5
10
(n< m && ((n * 5) == m || (n * 10) == m))
n-m
コーディング
ステップ 1 : ローマ数字と整数の関係を事前に作成し、Map
構造またはswith
判断を使用してswith
判断をより効率的にし、メモリ消費を削減します。Map
構造化されたコードはよりクリーンで読みやすくなります。
スイッチモード:
switch(Character.toString(s.charAt(i))){
case "I": now = 1;break;
case "V": now = 5;break;
case "X": now = 10;break;
case "L": now = 50;break;
case "C": now = 100;break;
case "D": now = 500;break;
case "M": now = 1000;break;
}
マップ構造:
HashMap<String,Integer> h = new HashMap(){
{
put("I",1);put("V",5);put("X",10);put("L",50);put("C",100);put("D",500);put("M",1000);
}};
ステップ 2 : 文字列をループして、各文字に対応する整数を取得します。
public static int romanToInt(String s) {
int now = 0; // 当前值
int sum = 0; // 总值
int prev = 0; // 上一个值
for (int i = 0; i < s.length(); i++) {
switch(Character.toString(s.charAt(i))){
case "I": now = 1;break;
case "V": now = 5;break;
case "X": now = 10;break;
case "L": now = 50;break;
case "C": now = 100;break;
case "D": now = 500;break;
case "M": now = 1000;break;
}
}
return sum;
}
ステップ3:通常は減算と加算であるため、異常論理の判定も増分と減算となる。注意
:減算減算の場合n-(m*2)
、減算する数値を一度増加させているため必要です。
public static int romanToInt(String s) {
int now = 0; // 当前值
int sum = 0; // 总值
int prev = 0; // 上一个值
for (int i = 0; i < s.length(); i++) {
switch(Character.toString(s.charAt(i))){
case "I": now = 1;break;
case "V": now = 5;break;
case "X": now = 10;break;
case "L": now = 50;break;
case "C": now = 100;break;
case "D": now = 500;break;
case "M": now = 1000;break;
}
if (prev < now && ((prev * 5) == now || (prev * 10) == now)){
now = now - (prev << 1);
}
prev = now;
sum = sum+now;
}
return sum;
}
比較
以下の図に示すように、使用switch
方法はMap
実行時間よりも速く1/4
、メモリ消費量は同様であり、構造は次のとおりです。3ms
swith
4ms
Map