アルゴリズムの問題 - ローマ数字の整数

タイトル説明

次の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();
}

おすすめ

転載: www.cnblogs.com/hao-yu/p/11698435.html