整数转罗马数字

整数转罗马数字

CategoryDifficultyLikesDislikes
algorithmsMedium (66.27%)868-

Tags

math | string

Companies

twitter

罗马数字包含以下七种字符: I, V, X, LCD  和  M

1
2
3
4
5
6
7
8
字符          数值
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。

给你一个整数,将其转为罗马数字。

示例  1:

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

示例  2:

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

示例  3:

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

示例  4:

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

示例  5:

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

提示:

  • 1 <= num <= 3999

Discussion | Solution

解法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
struct Solution;

// @lc code=start
impl Solution {
    /// ## 解题思路
    /// - 查表
    pub fn int_to_roman(num: i32) -> String {
        let ints = vec![1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
        let romans = vec![
            "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I",
        ];

        let mut num = num;
        let mut res = "".to_owned();
        ints.iter().enumerate().for_each(|(i, &n)| {
            while num >= n {
                for _ in 0..num / n {
                    res = format!("{}{}", res, romans[i])
                }
                num = num % n;
            }
        });

        res
    }
}
// @lc code=end

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Solution {
public:
	/*
	## 解题思路
	* 建立[1,4,9,10,...]映射关系,
	  每次从中选择最大可小于num的部分
	*/
	string intToRoman(int num) {
		pair<int, string> dict[] = {
			{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"},
		};

		string res;
		for(auto &[k, v]: dict) {
			while(num>=k) {
				num -= k;
				res += v;
			}
			if (num==0) {
				break;
			}
		}
		return res;
	}
};
updatedupdated2024-08-252024-08-25