2016-07-16 91 views
0

這是問題的地址。 https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/爲什麼我的leetcode上的C代碼在運行代碼和提交之間有不同的行爲?

這是我的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]

當我點擊運行代碼,永遠沒問題,並且代碼在我的MacBook Pro上正確運行,使用gcc作爲編譯器,gdb作爲調試器。

然而,當我點擊提交解決方案時,它輸出測試用例1的[0,0,3,3]。然後我嘗試註釋掉代碼「free(result);」,它輸出[0 ,0,1,1,2,2,3,3,4,4]爲測試用例2.測試用例2在測試用例1後面,這意味着測試用例1在註釋掉代碼「free(結果);」。

看來我註釋掉的代碼與結果沒有關係,我的代碼出了什麼問題?

謝謝!

回答

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

考慮像[1, 2, 2, 2, 2, 2]這樣的數組會發生什麼情況。它會愉快地閱讀過去的結尾。

你需要,當你到達終點停止循環:

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

哦,yeah.It真是bug.I有固定它,謝謝! – Coordinate35

相關問題