Leetcode 12 整数转罗马数字
题目描述
罗马数字包含以下七种字符: 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。
给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。
来源:力扣(LeetCode)题目链接
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解1(贪心:普普通通一循环)
//只需要把特殊情况罗列即可
class Solution {
public:
string intToRoman(int num) {
string finals = "";
while(num){
if(num >= 1000){
while(num >= 1000){
finals += "M";
num -= 1000;
}
}
if(num>=500 && num<1000){
if(num >= 900){
finals += "CM";
num -= 900;
}else{
while(num>=500 && num<1000){
finals += "D";
num -= 500;
}
}
}
if(num>=100 && num<500){
if(num >= 400){
finals += "CD";
num -= 400;
}else{
while(num>=100 && num<500){
finals += "C";
num -= 100;
}
}
}
if(num>=50 && num<100){
if(num >= 90){
finals += "XC";
num -= 90;
}else{
while(num>=50 && num<100){
finals += "L";
num -= 50;
}
}
}
if(num>=10 && num<50){
if(num >= 40){
finals += "XL";
num -= 40;
}else{
while(num>=10 && num<50){
finals += "X";
num -= 10;
}
}
}
if(num>=5 && num<10){
if(num == 9){
finals += "IX";
break;
}else{
while(num>=5 && num<10){
finals += "V";
num -= 5;
}
}
}
if(num>=1 && num<5){
if(num == 4){
finals += "IV";
break;
}else{
finals += "I";
num --;
}
}
}
return finals;
}
};

题解2(查表法)
class Solution {
public:
string intToRoman(int num) {
int values[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
string keys[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
string res = "";
for (int i = 0; i < 13; i ++ )
while(num >= values[i])
{
num -= values[i];
res += keys[i];
}
return res;
}
};

本文介绍了LeetCode上的12题——整数转罗马数字,详细解析了两种解题方法:贪心算法和查表法。贪心算法通过循环处理特殊情况,查表法则通过预定义的数值和对应字符直接转换。两种方法均能有效将1到3999范围内的整数转换为罗马数字。
1063

被折叠的 条评论
为什么被折叠?



