タイトル
次の7つを含むローマ数字文字:I、V、X、L、C、D及びM.
文字 | 数の |
---|---|
私 | 1 |
V | 5 |
バツ | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000年 |
例えば:IIとして書き込まローマ数字2、X + IIである二つの平行1.12 XII、として書かなければなりません。図27は、XXVII、即ちXX + V + IIのように書きます。
一般的に、大量に右にローマ数字の数が少ないです。しかし、例外もある、例えば、4 IIIIを書きますが、IVはありません。左番号5番号1において、多数の数が4を得た少ない数5で表される値に等しいです。同様に、数9は、IXで表されます。この特別なルールは以下の6つのケースにのみ適用されます。
私は、左V(5)とX(10)上にあってもよく、及び4,9を表現します。
X Lは、左(50)及びC(100)上に配置することができ、そして40と90が示されています。
Cは、400と900表すために、左側にD(500)とM(1000)上に配置することができます。
整数に変換するために、ローマ数字を考えます。入力は3999から1の範囲にあることを保証します。
思考
より高速になるマップテーブルを使用しようと思っていたが、その結果は、時間と空間の種類に裁判官にないとして、直接テーブルの初期化をマップに起因するかもしれませんが、。そして、私たちはそれを最適化するために行く時間を持っています。
考え
import java.util.HashMap;
public class T013 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println( romanToInt( "III" ) ); //3
System.out.println( romanToInt( "IV" ) ); //4
System.out.println( romanToInt( "IX" ) ); //9
System.out.println( romanToInt( "LVIII" ) ); //58
System.out.println( romanToInt( "MCMXCIV" ) ); //1994
}
public static int romanToInt(String s) {
HashMap<String, Integer> map = new HashMap<String, Integer >();
map.put( "M", 1000 );
map.put( "CM", 900 );
map.put( "D", 500 );
map.put( "CD", 400 );
map.put( "C", 100 );
map.put( "XC", 90 );
map.put( "L", 50 );
map.put( "XL", 40 );
map.put( "X", 10 );
map.put( "IX", 9 );
map.put( "V", 5 );
map.put( "IV", 4 );
map.put( "I", 1 );
if( s.length() > 1 && map.containsKey( s.substring(0, 2) ) )
return map.get( s.substring(0, 2) ) + romanToInt( s.substring(2) );
else if( s.length() > 0 && map.containsKey( s.substring(0, 1) ) )
return map.get( s.substring(0, 1) ) + romanToInt( s.substring(1) );
else if( map.containsKey( s ) )
return map.get( s.substring(0, 1) );
else
return 0;
}
}