前言
近期准备把力扣leetcode算法题刷一遍,算是一个Flag吗?几千道题啊啊啊啊啊。。。。。。我是不是膨胀了?
把我的C++解决方案记录在这里,与大家分享。
题目描述
罗马数字包含以下七种字符: 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 的范围内。
示例 1:
输入: 3
输出: "III"
示例 2:
输入: 4
输出: "IV"
示例 3:
输入: 9
输出: "IX"
示例 4:
输入: 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.
示例 5:
输入: 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.
C++代码实现
class Solution {
private:
string result = ""; //存储最终结果
size_t _num; //记录当前数值
public:
string intToRoman(int num) {
_num = num;
StrAppend(1000);
return result;
}
void StrAppend(size_t base) { //递归调用
switch (base) {
case 1000: {
if (_num >= 1000) {
result.append(_num / 1000, 'M');
_num = _num % 1000;
}
if (_num > 0) {
StrAppend(900);
}
} break;
case 900: {
if (_num >= 900) {
result.append(1, 'C');
result.append(1, 'M');
_num = _num - 900;
}
if (_num > 0) {
StrAppend(500);
}
} break;
case 500: {
if (_num >= 500) {
result.append(1, 'D');
_num = _num - 500;
}
if (_num > 0) {
StrAppend(400);
}
} break;
case 400: {
if (_num >= 400) {
result.append(1, 'C');
result.append(1, 'D');
_num = _num - 400;
}
if (_num > 0) {
StrAppend(100);
}
} break;
case 100: {
if (_num >= 100) {
result.append(_num / 100, 'C');
_num = _num % 100;
}
if (_num > 0) {
StrAppend(90);
}
} break;
case 90: {
if (_num >= 90) {
result.append(1, 'X');
result.append(1, 'C');
_num = _num - 90;
}
if (_num > 0) {
StrAppend(50);
}
} break;
case 50: {
if (_num >= 50) {
result.append(1, 'L');
_num = _num - 50;
}
if (_num > 0) {
StrAppend(40);
}
} break;
case 40: {
if (_num >= 40) {
result.append(1, 'X');
result.append(1, 'L');
_num = _num - 40;
}
if (_num > 0) {
StrAppend(10);
}
} break;
case 10: {
if (_num >= 10) {
result.append(_num / 10, 'X');
_num = _num % 10;
}
if (_num > 0) {
StrAppend(9);
}
} break;
case 9: {
if (_num == 9) {
result.append(1, 'I');
result.append(1, 'X');
_num = _num - 9;
}
if (_num > 0) {
StrAppend(5);
}
} break;
case 5: {
if (_num >= 5) {
result.append(1, 'V');
_num = _num - 5;
}
if (_num > 0) {
StrAppend(4);
}
} break;
case 4: {
if (_num >= 4) {
result.append(1, 'I');
result.append(1, 'V');
_num = _num - 4;
}
if (_num > 0) {
StrAppend(1);
}
} break;
case 1: {
if (_num >= 1) {
result.append(_num / 1, 'I');
}
} break;
default: {};
}
}
};
代码性能
复制粘贴1000那段的代码,导致提交了四次代码啊。。。