12.字符转罗马字(javascript)IntegertoRoman

原创
小哥 3年前 (2022-11-10) 阅读数 2 #大杂烩

罗马数字包含以下七个字符: 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。数字 1 在数字 5 在左边,表示的数字等于大数字。 5 减小数 1 获得的数值 4 。同样,数字 9 表示为 IX。该特定规则仅适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 在的左侧 4 和 9。
X 可以放在 L (50) 和 C (100) 在的左侧 40 和 90。
C 可以放在 D (500) 和 M (1000) 在的左侧 400 和 900。
给你一个整数并将其转换为罗马数字。

Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.

Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
For example, 2 is written as II in Roman numeral, just two one’s added together. 12 is written as XII, which is simply X + II. The number 27 is written as XXVII, which is XX + V + II.

Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:

I can be placed before V (5) and X (10) to make 4 and 9.
X can be placed before L (50) and C (100) to make 40 and 90.
C can be placed before D (500) and M (1000) to make 400 and 900.
Given an integer, convert it to a roman numeral.

示例 1:

输入: num = 3
输出: "III"

示例 2:

输入: num = 4
输出: "IV"

示例 3:

输入: num = 9
输出: "IX"

示例 4:

输入: num = 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.

示例 5:

输入: num = 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.

解决问题的思路:
根据罗马数字的独特表示,为了表示给定的整数。 num,我们不再寻找 num 的最大符号值 num 减去符号值并继续查找 num 的最大符号值该符号拼接在上一个找到的符号之后,循环直至 num 为 00。最后一个字符串是 num 罗马数字表示。

编程时,可以创建值。-符号对列表 valueSymbols,按从大到小的数字顺序。遍历(Traversal) valueSymbols 中的每个值-符号对,如果当前值 value 不超过 num,则从 num 不断减法value,直至 num 小于value,然后遍历下一个值。-符号对。如果在遍历中 num 为 0 然后跳出循环。

var intToRoman = function (num) {
//列出所有可能的情况
    const valueSymbols = [
        [1000, M],
        [900, CM],
        [500, D],
        [400, CD],
        [100, C],
        [90, XC],
        [50, L],
        [40, XL],
        [10, X],
        [9, IX],
        [5, V],
        [4, IV],
        [1, I]
    ]
    let result = []
    for (const [value, key] of valueSymbols) {
        while (num >= value) {
            num -= value
            result.push(key)
        }
        if (num == 0) {
            break
        }
    }
    return result.join("")
};

var intToRoman = function(num) {
    const valueSymbols = [
        [1000, M],
        [900, CM],
        [500, D],
        [400, CD],
        [100, C],
        [90, XC],
        [50, L],
        [40, XL],
        [10, X],
        [9, IX],
        [5, V],
        [4, IV],
        [1, I]
    ]
    let result = []
    for (const [value, key] of valueSymbols) {
        console.log("value, key外", value, key);
        while (num >= value) {
            console.log("value内", value);
            num -= value
            result.push(key)
        }
        if (num == 0) {
            break
        }
    }
    console.log("result", result);
};
intToRoman(1994)

// value, key外 1000 M
// value内 1000
// value, key外 900 CM
// value内 900
// value, key外 500 D
// value, key外 400 CD
// value, key外 100 C
// value, key外 90 XC
// value内 90
// value, key外 50 L
// value, key外 40 XL
// value, key外 10 X
// value, key外 9 IX
// value, key外 5 V
// value, key外 4 IV
// value内 4
// result (4) [M, CM, XC, IV]

leetcode: https://leetcode.cn/problems/integer-to-roman/

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除