You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:23:14