タイトル説明
次の7つを含むローマ数字文字:I、V、X、L、C、D及びM.
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例えば、ローマ数字2 IIのように書く、二つの平行1.12 XIIのように記述されなければならない、すなわち、X + IIです。27 XXVII、即ちXX + V + IIのように書きます。
一般的に、大量に右にローマ数字の数が少ないです。しかし、例外もある、例えば、4 IIIIを書きますが、IVはありません。左番号5番号1において、4得られた還元番号5で表される値に等しい多数の数。同様に、数9は、IXで表されます。この特別なルールは以下の6つのケースにのみ適用されます。
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
整数を考えると、ローマ数字に変換します。入力は3999から1の範囲にあることを保証します。
示例 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.
出典:滞在ボタン(LeetCode)
リンク:https://leetcode-cn.com/problems/integer-to-roman
難易度:穏健派
問題の解決策
考える:タイトルから与えられた「ローマ数字」とアラビア数字との対応、および変換規則は、私たちは「ローマ数字」とは何の組み合わせを導出する必要があります。
これは、整数を分解するための「添加率」、及び整数因数分解の数としてデジタル権利この表の上、我々は、より良い、すなわち、デジタルフロントを利用すること、すなわち、プロセス「整数桁を変換します」それは貪欲なルールと考えることができます。
public String intToRoman(int num) {
// 把阿拉伯数字与罗马数字可能出现的所有情况和对应关系,放在两个数组中
// 并且按照阿拉伯数字的大小降序排列,这是贪心选择思想
int[] nums = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
String[] romans = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
StringBuilder stringBuilder = new StringBuilder();
int index = 0;
while (index < 13) {
// 特别注意:这里是等号
while (num >= nums[index]) {
// 注意:这里是等于号,表示尽量使用大的"值"
stringBuilder.append(romans[index]);
num -= nums[index];
}
index++;
}
return stringBuilder.toString();
}