LeetCode罗马数字转整数C语言实现:MCMXCIV测试用例异常
罗马数字转整数代码问题排查与修复
你的代码在处理罗马数字特殊组合(如IV、IX、CM等)时逻辑完全错误,这是导致"MCMXCIV"输出3099而非1994的核心原因。
问题根源
罗马数字的特殊组合规则是:当小值符号出现在大值符号左侧时,实际值是大值减小值(比如IV=4=5-1,CM=900=1000-100)。但你的代码逻辑是先把两个符号的正常值都加上,再额外加一个数,直接导致重复计算。
比如IV的计算:你的代码先加1+5=6,再额外加3,最终得到9,完全偏离正确值4。
另外还有两个小问题:
if (*s == NULL)判断错误:空指针应该判断s == NULL,*s是取字符串第一个字符,和NULL(指针)比较无意义;而且返回NULL给int类型函数是错误的,应该返回0。- 循环中每次调用
strlen(s)会重复计算字符串长度,拖慢效率,建议先把长度存到变量里。
修复后的代码
int romanToInt(char *s) { int sum = 0; // 处理空输入 if (s == NULL || *s == '\0') { return 0; } int len = strlen(s); for (int i = 0; i < len; i++) { int current = 0; // 映射当前字符到对应数值 switch(s[i]) { case 'M': current = 1000; break; case 'D': current = 500; break; case 'C': current = 100; break; case 'L': current = 50; break; case 'X': current = 10; break; case 'V': current = 5; break; case 'I': current = 1; break; } // 处理特殊组合:当前值大于前一个值,说明之前多加了一次前值,要减去两倍前值 if (i > 0) { int prev = 0; switch(s[i-1]) { case 'M': prev = 1000; break; case 'D': prev = 500; break; case 'C': prev = 100; break; case 'L': prev = 50; break; case 'X': prev = 10; break; case 'V': prev = 5; break; case 'I': prev = 1; break; } if (current > prev) { sum += current - 2 * prev; continue; } } sum += current; } return sum; }
更简洁的写法
可以改成先判断后累加的逻辑,提前识别特殊组合,避免重复计算前值:
int romanToInt(char *s) { int sum = 0; if (s == NULL || *s == '\0') return 0; int len = strlen(s); for (int i = 0; i < len; i++) { int val = 0; switch(s[i]) { case 'I': val = 1; break; case 'V': val = 5; break; case 'X': val = 10; break; case 'L': val = 50; break; case 'C': val = 100; break; case 'D': val = 500; break; case 'M': val = 1000; break; } // 如果当前值小于下一个值,就减去当前值,否则加上 if (i < len - 1) { int next_val = 0; switch(s[i+1]) { case 'I': next_val = 1; break; case 'V': next_val = 5; break; case 'X': next_val = 10; break; case 'L': next_val = 50; break; case 'C': next_val = 100; break; case 'D': next_val = 500; break; case 'M': next_val = 1000; break; } if (val < next_val) { sum -= val; continue; } } sum += val; } return sum; }
内容的提问来源于stack exchange,提问作者AB111122
相关产品推荐
相关产品推荐

