为什么我的leetcode上的C代码在运行代码和提交之间有不同的行为?

时间:2016-07-16 09:47:52

标签: c

这是问题的地址。 https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/

这是我的C代码:

int removeDuplicates(int* nums, int numsSize) {
    int* result;
    int result_pointer = 0;
    int allow_appearance = 2;
    int appeared_number;
    int i;
    if (0 == numsSize) {
        return 0;
    }
    result = (int*)malloc(numsSize * sizeof(int));
    for (i = 0; i < numsSize; i++) {
        appeared_number = 1;
        result[result_pointer] = nums[i];
        result_pointer += 1;
        while (nums[i + 1] == nums[i]) {
            i += 1;
            if (appeared_number < allow_appearance) {
                result[result_pointer] = nums[i];
                result_pointer += 1;
                appeared_number += 1;
            }
        }
    }
    for (i = 0; i < result_pointer; i++) {
        nums[i] = result[i];
    }
    free(result);
    return result_pointer;
}

测试数据: 测试用例1:[0,0,0,0,3](第158例) 测试案例2:[0,0,1,1,1,2,2,2,3,3,4](第163例)

正确输出: 测试用例1:[0,0,3] 对于测试用例2:[0,0,1,1,2,2,3,3,4]

当我点击Run Code时,一切正常,代码在我的macbook pro上正确运行,使用gcc作为编译器,gdb作为调试器。

但是,当我单击Submit Solution时,它会为测试用例1输出[0,0,3,3]。 然后我尝试将代码“free(result);”注释掉,输出[0,0,1,1,2,2,3,3,4,4]作为测试用例2.测试用例2落后测试用例1,这意味着在注释掉代码“free(result);”后传递了测试用例1.

似乎我注释掉的代码与结果无关,我的代码有什么问题?

谢谢!

1 个答案:

答案 0 :(得分:1)

while (nums[i + 1] == nums[i]) { ... }

考虑像[1, 2, 2, 2, 2, 2]这样的数组会发生什么。它会愉快地读到最后。

到达终点时需要停止循环:

while (i+1 < numsSize && nums[i + 1] == nums[i]) { ... }