ローマ数字を整数に変換する (13) 解決策

トピック

Iローマ数字には、V、 、XLCDおよびの 7 文字が含まれますM

キャラクター 価値
1
V 5
バツ 10
L 50
C 100
D 500
M 1000

たとえば、ローマ数字は、つまり 2 つ並べて2書かれます+書きます++書きますII112XIIXII27XXVIIXXVII

通常、ローマ数字の小さい桁は大きい桁の右側にあります。ただし、と4書かずに と書くなど特殊な場合もあります数字は数字の左側にあり、表される数字は大きな数字から数字を減じた値に等しくなります同様に、数値はとして表されますIIIIIV1551 49IX

この特定のルールは、次の 6 つの状況にのみ適用されます。

  • IV(5) とX(10)の左側に配置して、4 と 9 を表すことができます。
  • XL(50) とC(100)の左側に配置して、40 と 90 を表すことができます。
  • CD(500) とM(1000)の左側に配置して、400 と 900 を表すことができます。

与えられたローマ数字を整数に変換します。

分析する

ルールが明確になったら、ルールの特徴を分析します。

特徴 1 :通常は小数在大树加算右边する
特徴 2 :小数在大数はいの場合左边、上記 6 つの場合を判断して減算します。

n前者m例に挙げると、上記の特徴分析から、隣り合う 2 つの数字が減少している場合は ( n>m= ) を追加して増加し、 n+m6 つの状況を満たすかどうかを判断します。6 つの状況の共通の特徴は、「はい」とmはいn」です。回、この場合 ( = )510(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、メモリ消費量は同様であり、構造は次のとおりです3msswith4msMap
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/AnNanDu/article/details/126662058