共计 1199 个字符,预计需要花费 3 分钟才能阅读完成。
罗马数字的计数规则
- 相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3;
- 小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;
- 小的数字、(限于 Ⅰ、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;
- 正常使用时、连写的数字重复不得超过三次;
- 在一个数的上面画一条横线、表示这个数扩大 1000 倍
代码实现:
百度百科给的答案:
该答案通过建表的方式把所有的可能出现的异常点全部包含进来,然后查表实现。
比如9,答案应该是IX,如果正常处理就要考虑跟1,5,10之间的关系,需要写相关的判定,一定程度上增加了代码量
class Solution {
public:
string intToRoman(int num) {
char* c[4][10]={
{"","I","II","III","IV","V","VI","VII","VIII","IX"},
{"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
{"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
{"","M","MM","MMM"}
};
string roman;
roman.append(c[3][num / 1000 % 10]);
roman.append(c[2][num / 100 % 10]);
roman.append(c[1][num / 10 % 10]);
roman.append(c[0][num % 10]);
return roman;
}
};
leetcode提交的代码:
class Solution {
public:
void setDigit(string &res, int n, char a, char b, char c) {
if (n < 4)
{
for (int i = 0; i < n; ++i)
{
res.push_back(a);
}
}
if (n == 4)
{
res.push_back(a);
res.push_back(b);
}
if (n == 5)
res.push_back(b);
if (n > 5 && n < 9)
{
res.push_back(b);
for (int i = 5; i < n; ++i) {
res.push_back(a);
}
}
if (n == 9) {
res.push_back(a);
res.push_back(c);
}
}
string intToRoman(int num) {
int t = (num / 1000) % 10, h = (num / 100) % 10, d = (num / 10) % 10, n = num % 10;
string res;
setDigit(res, t, 'M', '?', '?');
setDigit(res, h, 'C', 'D', 'M');
setDigit(res, d, 'X', 'L', 'C');
setDigit(res, n, 'I', 'V', 'X');
return res;
}
};
正文完
请博主喝杯咖啡吧!