第一种方法:
只需要28ms,但是是简单的罗列,代码量比较大;
class Solution {
public:
string intToRoman(int num) {
char c[1000];
int pos = 0;
if(num >= 1000)
{
for(int i = 0;i<num/1000;i++)
c[pos++] = 'M';
num %= 1000;
}
//num [0, 999]
if(num >= 900)
{
c[pos++] = 'C';
c[pos++] = 'M';
num -= 900;
}
//num [0, 899]
if(num >= 500)
{
c[pos++] = 'D';
num -= 500;
}
//num [0 - 499]
if(num >= 400)
{
c[pos++] = 'C';
c[pos++] = 'D';
num -= 400;
}
//num [0, 399]
if(num >= 100)
{
for(int i = 0;i<num / 100;i++)
{
c[pos++] = 'C';
}
num %= 100;
}
//0-99
if(num >= 90)
{
c[pos++] = 'X';
c[pos++] = 'C';
num -= 90;
}
//0-89
if(num >= 50)
{
c[pos++] = 'L';
num -= 50;
}
//0 - 49
if(num >= 40)
{
c[pos++] = 'X';
c[pos++] = 'L';
num -= 40;
}
//0, 39
if(num >= 10)
{
for(int i = 0;i<num /10;i++)
{
c[pos++] = 'X';
}
num = num % 10;
}
//0, 9
if(num == 9)
{
c[pos++] = 'I';
c[pos++] = 'X';
num = 0;
}
//0 - 8
if(num >= 5)
{
c[pos++] = 'V';
num -= 5;
}
//0, 4
if(num == 4)
{
c[pos++] = 'I';
c[pos++] = 'V';
num = 0;
}
//0 - 3
if(num > 0)
{
for(int i = 0;i<num;i++)
c[pos++] = 'I';
}
c[pos] = '\0';
string str(c);
return str;
}
};
第二种方法:
对代码进行了整理,代码量少,但是耗时36ms,因为每次都需要从1000开始判断不断循环。
class Solution {
public:
string intToRoman(int num) {
//M D C L X V I
//1000 500 100 50 10 5 1
int RomanNum[10] = {1000, 500, 100, 50, 10, 5, 1};
char RomanC[10] = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};
int start = 0;
int Sub[10] = {100, 100, 10, 10, 1, 1};
char SubRoman[10] = {'C', 'C', 'X', 'X', 'I', 'I'};
int SubStart = -1;//取值为1000的时候不需要检测
char c[1000];
int pos = 0;
while(num != 0)
{
if(num >= RomanNum[start]) //500
{
if(start >= 1 &&num >= RomanNum[start-1] - Sub[SubStart]) // 1000 - 100
{
c[pos++] = SubRoman[SubStart];
c[pos++] = RomanC[start-1];
num -= (RomanNum[start-1] - Sub[SubStart]);
}
for(int i = 0;i<num / RomanNum[start];i++)
{
c[pos++] = RomanC[start];
}
num %= RomanNum[start];
}
start++;
SubStart++;
}
c[pos] = '\0';
string str(c);
return str;
}
};