整数からローマ数字
トピックリンク:
https://leetcode-cn.com/problems/integer-to-roman/
タイトル説明
ローマ数字には、I、V、X、L、C、D、およびMの7つの文字が含まれています。
文字値
I 1
V 5
X 10
L 50
C 100
500 D
M 1000は、
たとえば、ローマ数字2は、二つの平行1S手段II、として書かれ、27 XXVII手段として書き込まれ、12の手段は、X + II XII、として書かれていますXX + V + IIです。
通常、ローマ数字の小さい数字は大きい数字の右側にありますが、特別な場合があります。たとえば、4はIIIIとしてではなく、IVとして記述されます。番号1は番号5の左側にあり、表されている番号は、大きい番号5から番号1を引いた番号4と同じです。同様に、番号9はIXとして表されます。この特別なルールは、次の6つの状況にのみ適用されます
。4と9を表すためにV(5)とX(10)
の左側に配置できます。XはL(50)とC(100)の左側に配置できます。40と90を表すには、
CをD(500)とM(1000)の左側に配置して、400と900を表すことができます。
整数を指定して、ローマ数字に変換します。入力が1〜3999の範囲にあることを確認してください。
例:
例1:
入力:3
出力:「III」
例2:
入力:4
出力:「IV」
例3:
入力:9
出力:「IX」
例4:
入力:58
出力:「LVIII」
説明:L = 50、 V = 5、III = 3。
例5:
入力:1994
出力:「MCMXCIV」の
説明:M = 1000、CM = 900、XC = 90、IV = 4。
解決
アイデア1:時間の複雑さ:O(N)空間の複雑さ:O(1)
まず、質問の意味から、ローマ数字には次の記号とそれに対応する値があることがわかります。
キャラクター | 値 |
---|---|
私 | 1 |
V | 5 |
バツ | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
詳細なローマ数字のカウントルールは次のとおりです。
- 同じ番号が連続して書き込まれ、表される番号は、これらの番号を加算して得られる番号と同じです。例:III = 3;
- 小さい数は大きい数の右側にあり、表される数はこれらの数を加算することによって得られる数に等しくなります。例:VIII = 8;
- 通常の使用では、連続した番号は3回を超えて繰り返されてはなりません。
ここでの解決策では、2次元配列法を使用して問題を解決します。貪欲なアルゴリズムは使用されません。この問題のLeetCodeソリューションは貪欲なアルゴリズムを使用します。
class Solution {
public String intToRoman(int num) {
String[][] roman = {
{
"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},
{
"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},
{
"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"},
{
"", "M", "MM", "MMM"}
};
String ret = "";
for (int i = 0; i < 4; i++) {
ret = roman [i][num % 10] + ret;
num /= 10;
}
return ret;
}
}