一、题目 二、解题思路
我们遍历题目给出的字符串时,大部分情况下都是从大到小的顺序:M > D > C > L > X > V > I,但也会有一些特殊情况,所以我们须分两种情况进行讨论: (1)字符为C、X、I 时,在不超出字符串范围的情况下,需多判断一位字符,因为它们组成CD,CM,XL,XC, IV,IX这几个特殊的字符串,是表示较小的数在表示较大的数的左边。 (2)M , D , L , V ,这几个数可以转换成相应的数字,不用做特殊处理。
注意点:刚开始我用宏定义代替数字的形式,为了后续代码修改方便和看着简洁,发现第一次运行花了12ms,初步判断是编译时宏定义需要拼接到代码中,这可能消耗一些时间,后面我去掉宏定义直接用数字的方式运行代码花了0ms,这里做一下简记,也知会一下各位读者。
三、VS-2022-测试代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STRLEN 10
int romanToInt(char* s);
void main() {
size_t i;
char StrArr[][STRLEN] = {"III" ,"IV" ,"IX" ,"LVIII"};
int StrArrSize = sizeof(StrArr) / (sizeof(char) * STRLEN);
printf("StrArrSize : %d\n", StrArrSize);
for (i = 0; i < StrArrSize; i++)
{
printf("str : %s, res : %d\n", StrArr[i], romanToInt(StrArr[i]));
printf("+++++++++++++++++++++\n");
}
}
int romanToInt(char* s) {
int i = 0;
int res = 0;
int s_size = strlen(s);
while (s[i] != '\0')
{
printf("s[%d] : %c\n",i,s[i]);
switch (s[i])
{
case 'M':
res = res + 1000;
break;
case 'D':
res = res + 500;
break;
case 'C':
if ((i + 1 < s_size) && (s[i + 1] == 'M'))
{
i++;
res = res + 900;
}
else if ((i + 1 < s_size) && (s[i + 1] == 'D'))
{
i++;
res = res + 400;
}
else
{
res = res + 100;
}
break;
case 'L':
res = res + 50;
break;
case 'X':
if ((i + 1 < s_size) && (s[i + 1] == 'L'))
{
i++;
res = res + 40;
}
else if ((i + 1 < s_size) && (s[i + 1] == 'C'))
{
i++;
res = res + 90;
}
else
{
res = res + 10;
}
break;
case 'V':
res = res + 5;
break;
case 'I':
if ((i + 1 < s_size) && (s[i + 1] == 'V'))
{
i++;
res = res + 4;
}
else if ((i + 1 < s_size) && (s[i + 1] == 'X'))
{
i++;
res = res + 9;
}
else
{
res = res + 1;
}
break;
default:
break;
}
i++;
}
return res;
}
四、VS-2022-运行截图 五、leecode提交代码
int romanToInt(char* s) {
int i = 0;
int res = 0;
int s_size = strlen(s);
while (s[i] != '\0')
{
switch (s[i])
{
case 'M':
res = res + 1000;
break;
case 'D':
res = res + 500;
break;
case 'C':
if ((i + 1 < s_size) && (s[i + 1] == 'M'))
{
i++;
res = res + 900;
}
else if ((i + 1 < s_size) && (s[i + 1] == 'D'))
{
i++;
res = res + 400;
}
else
{
res = res + 100;
}
break;
case 'L':
res = res + 50;
break;
case 'X':
if ((i + 1 < s_size) && (s[i + 1] == 'L'))
{
i++;
res = res + 40;
}
else if ((i + 1 < s_size) && (s[i + 1] == 'C'))
{
i++;
res = res + 90;
}
else
{
res = res + 10;
}
break;
case 'V':
res = res + 5;
break;
case 'I':
if ((i + 1 < s_size) && (s[i + 1] == 'V'))
{
i++;
res = res + 4;
}
else if ((i + 1 < s_size) && (s[i + 1] == 'X'))
{
i++;
res = res + 9;
}
else
{
res = res + 1;
}
break;
default:
break;
}
i++;
}
return res;
}
六、leecode运行结果
|