LeetCode与在线编译器中基础计算器C代码运行结果不一致问题排查
基础计算器实现问题:LeetCode与在线编译器结果不一致
我实现了一个仅支持+、-运算符与()括号的基础计算器C代码,在在线编译器中所有测试用例输出均正确,但在LeetCode平台上仅首个测试用例结果正确,其余全部错误。我怀疑这是LeetCode对全局变量的处理方式导致的问题,相关代码与测试用例如下:
LeetCode提交版代码
int pos = 0; int calculate(char *s) { int sign = 1; int sum = 0; int len = strlen(s); while (pos < len && s[pos] != ')') { if (s[pos] == '-') { sign = -1; printf("-\n"); } else if (s[pos] == '+') { sign = 1; printf("+\n"); } else if (s[pos] == '(') { pos++; sum += sign * calculate(s); printf("%d\n", sum); } else { int a = s[pos] - 48; if (a >= 0 && a < 10) { sum = sum + a * sign; printf("%d\n", sum); } } pos++; } return sum; }
在线编译器测试版代码(添加main函数)
// Online C compiler to run C program online #include <stdio.h> int pos = 0; int calculate(char *s) { int sign = 1; int sum = 0; int len = strlen(s); while (pos < len && s[pos] != ')') { if (s[pos] == '-') { sign = -1; printf("-\n"); } else if (s[pos] == '+') { sign = 1; printf("+\n"); } else if (s[pos] == '(') { pos++; sum += sign * calculate(s); printf("%d\n", sum); } else { int a = s[pos] - 48; if (a >= 0 && a < 10) { sum = sum + a * sign; printf("%d\n", sum); } } pos++; } return sum; } int main() { printf("\n\nResult: %d", calculate(" (2-1 + 2 -(2+2))+8")); return 0; }
测试用例
- 输入:
"1 + 1" - 输入:
" 2-1 + 2 " - 输入:
"(1+(4+5+2)-3)+(6+8)"
问题原因分析
问题确实出在全局变量pos上。LeetCode平台会连续运行多个测试用例,每次测试都会调用calculate函数,但全局变量pos在一次测试结束后不会自动重置为0,下一次测试时会从上次结束的位置开始解析字符串,自然会得到错误结果。而在线编译器中只调用一次calculate,pos从0开始到结束,不会有问题。
解决方案
去掉全局变量pos,改用指针传递位置参数,让每个递归调用都能共享当前的位置状态,同时每次顶层调用时初始位置为0。另外原代码未处理空格字符,这也可能导致部分测试用例出错,修改后的代码补充了空格处理逻辑:
int calculateHelper(char *s, int *pos) { int sign = 1; int sum = 0; int len = strlen(s); while (*pos < len && s[*pos] != ')') { if (s[*pos] == '-') { sign = -1; (*pos)++; continue; } else if (s[*pos] == '+') { sign = 1; (*pos)++; continue; } else if (s[*pos] == '(') { (*pos)++; sum += sign * calculateHelper(s, pos); (*pos)++; continue; } else if (s[*pos] == ' ') { (*pos)++; continue; } else { int a = s[*pos] - '0'; if (a >= 0 && a < 10) { sum += a * sign; } (*pos)++; } } return sum; } int calculate(char *s) { int pos = 0; return calculateHelper(s, &pos); }
内容的提问来源于stack exchange,提问作者Confused Coder
相关产品推荐
相关产品推荐

