题目来源
12. 整数转罗马数字 - 力扣(LeetCode)
题目描述
七个不同的符号代表罗马数字,其值如下:
符号 | 值 |
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:
- 如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
- 如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (
V
) 减 1 (I
):IV
,9 是 10 (X
) 减 1 (I
):IX
。仅使用以下减法形式:4 (IV
),9 (IX
),40 (XL
),90 (XC
),400 (CD
) 和 900 (CM
)。 - 只有 10 的次方(
I
,X
,C
,M
)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V
),50 (L
) 或 500 (D
)。如果需要将符号附加4次,请使用 减法形式。
给定一个整数,将其转换为罗马数字。
示例 1
输入:num = 3749
输出: "MMMDCCXLIX"
解释:
3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)
700 = DCC 由于 500 (D) + 100 (C) + 100 (C)
40 = XL 由于 50 (L) 减 10 (X)
9 = IX 由于 10 (X) 减 1 (I)
注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位
示例 2
输入:num = 58
输出:"LVIII"
解释:
50 = L
8 = VIII
示例 3
输入:num = 1994
输出:"MCMXCIV"
解释:
1000 = M
900 = CM
90 = XC
4 = IV
提示
1 <= num <= 3999
题目解析
本题是一道逻辑模拟题。
首先,我们需要配置: 阿拉伯数字 和 罗马数字 的映射表。(从大到小配置)
这里我的策略是定义两个数组:nums 和 romans
nums 记录阿拉伯数字,romans 记录 罗马数字,二者通过索引一一对应
然后,我们遍历映射表的阿拉伯数字 nums[i]:
- 若 num >= nums[i],则 num -= nums[i],并将对应的 romans[i] 拼接到结果串
- 若 num < nums[i],则 i++
直到 i >= nums.length 或者 num <= 0 时停止。
C源码实现
char* intToRoman(int num) {int nums[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};char* romans[] = {"M", "CM", "D", "CD", "C", "XC", "L","XL", "X", "IX", "V", "IV", "I"};int nums_size = 13;char* ans = (char*)calloc(100, sizeof(char));int i = 0;while (i < nums_size && num > 0) {if (num >= nums[i]) {strcat(ans, romans[i]);num -= nums[i];} else {i++;}}return ans;
}
C++源码实现
class Solution {
public:string intToRoman(int num) {vector<int> nums{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};vector<string> romans{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};string ans;int i = 0;while (i < nums.size() && num > 0) {if (num >= nums[i]) {ans += romans[i];num -= nums[i];} else {i++;}}return ans;}
};
Java源码实现
class Solution {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 sb = new StringBuilder();int i = 0;while(i < nums.length && num > 0) {if(num >= nums[i]) {sb.append(romans[i]);num -= nums[i];} else {i++;}}return sb.toString();}
}
Python源码实现
class Solution(object):def intToRoman(self, num):""":type num: int:rtype: str"""nums = ( 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 )romans = ( "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" )ans = []i = 0while i < len(nums) and num > 0:if num >= nums[i]:ans.append(romans[i])num -= nums[i]else:i += 1return "".join(ans)
JavaScript源码实现
/*** @param {number} num* @return {string}*/
var intToRoman = function (num) {const nums = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];const romans = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"];const ans = [];let i = 0;while (i < nums.length && num > 0) {if (num >= nums[i]) {ans.push(romans[i]);num -= nums[i];} else {i++;}}return ans.join("");
};