题目重现:
七个不同的符号代表罗马数字,其值如下:
符号 | 值 |
---|---|
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
实现思路:
首先,将输入的整数分割为千、百、十、个四个位上的数值;然后,针对每个位上的数值,通过查表的方式(利用预设字符串模板)决定如何组合基本的罗马数字字符(I, V, X, L, C, D, M)以形成该位的罗马数字表示;对于每个位,采用条件判断来区分是否需要使用减法规则(如4用IV表示,9用IX表示等),并考虑重复叠加规则(只能连续重复I、X、C、M最多三次)。最后,将每个位上转换得到的罗马数字字符串连接起来,得到最终的罗马数字表示。
关键代码:
for(i = 1; i < 5; i++) // 遍历每位(从个位到千位)
{
if(x[i] < 4) // 如果当前位数值小于4
{
ans = str[i].substr(1, x[i]) + ans; // 添加相应数量的基本罗马数字字符
}
else if(x[i] == 4) // 当前位数值为4,应用减法规则
{
ans = str[i].substr(3, 2) + ans; // 如IX, XL, CD, CM
}
else if(x[i] < 9) // 当前位数值在5到8之间
{
ans = str[i].substr(4, x[i] - 4) + ans; // 添加5的倍数的罗马数字再加相应数量的1
}
else // 当前位数值为9,应用减法规则
{
ans = str[i].substr(7, 2) + ans; // 如IX, XL, CD, CM
}
}
这段代码通过循环处理每一位的数值,并根据数值大小选择不同的罗马数字组合方式,最终拼接成完整的罗马数字字符串。
通过截图:
完整代码:
class Solution {
public:
string intToRoman(int num) {
int n,i,x[5];
n=num;
x[4]=n/1000;//获得每个位的值
x[3]=n%1000/100;
x[2]=n%1000%100/10;
x[1]=n%1000%100%10;
string str[5]={"qqqqq","qIIIVIIIX","qXXXLXXXC","qCCCDCCCM","qMMM"};
//每个位对应不同的取值,无用的qqqqq是为了一一对应,第一个为q都是为了让第一个字符下标从1开始
string ans="";
for(i=1;i<5;i++)//4次循环依次判断,储存答案
{
if(x[i]<4)
{
ans=str[i].substr(1,x[i])+ans;
}
else if(x[i]==4)
{
ans=str[i].substr(3,2)+ans;
}
else if(x[i]<9)
{
ans=str[i].substr(4,x[i]-4)+ans;
}
else
{
ans=str[i].substr(7,2)+ans;
}
}
return ans;//返回答案
}
};