2016-01-07 138 views
0

我在Leetcode上做了一個問題。問題是給定一個數組和一個值,移除該值的所有實例並返回新的長度。 或者你可以讀取它here刪除給定數組中的元素

int removeElement(int* nums, int numsSize, int val) { 
    int *nums_copy; 
    int count = 0; 
    int actual_count = 0; 


    while (actual_count < numsSize) { 

     if (nums[actual_count] != val) { 
      nums_copy[count] = nums[actual_count]; 
      count++; 
      nums_copy = realloc(nums_copy, sizeof(int)* count); 
     } 
     actual_count++; 
    } 

    nums = nums_copy; 
    return actual_count; 
} 

當我試圖用[1, 2, 2, 3], 2進行測試,輸出是[1, 2, 2, 3]而預期輸出爲[1, 3]

+0

你爲什麼不點擊[討論](https://leetcode.com/discuss/questions/oj/remove-element),看看其他人如何解決這個問題? –

回答

0

該問題不需要內存分配。所有需要的是將匹配元素放在列表的末尾。這是一個例子。

array = 3, 2, 5, 2, 7, 2 
len = 6 
val = 2 

我們要做到像

array = 3, 7, 5, 2, 2, 2 
newlength = 3 

SOLUTION一種方法是以下

重複:

開始有兩個標記(無論是指數或指針)一個指向到最左邊,一個指向最右邊的元素

3, 2, 5, 2, 7, 2 
L    R 

如果與「val」匹配,則將左側標記向右移。直到匹配停止或到達正確的標記爲止。

3, 2, 5, 2, 7, 2 
    L   R 

(右側標記對面)如果右側標記與「val」匹配,則向右移動標記。直到匹配停止或到達左側標記爲止。

3, 2, 5, 2, 7, 2 
    L  R 

交換對應於左右標記的元素。

3, 7, 5, 2, 2, 2 
    L  R 

轉到重複。

0

顯然,您還沒有指定在int *nums_copy之後要分配多少內存。使用來自stdlibmalloc在堆上分配可變數量的內存,或使用alloca分配到堆棧上,但記住this

1

首先,您不需要重新分配,該問題表示刪除了適當的值。其次,當你遇到搜索值時,你需要做的只是遍歷數組,並將它向左移一個位置。並減少結果計數。

-1

這裏這應該工作:

int removeElement(int* nums, int numsSize, int val) { 
    int countNums = 0; 
    int countCpy = 0; 

    while (countNums < numsSize) { 
     if (nums[countNums] != val) { 
      // Copy the number. 
      nums[countCpy] = nums[countNums]; 
      ++ countCpy; 
     } 

     ++ countNums; 
    } 

    return countCpy; 
} 

至於爲什麼這個輸出你得到了[1,2,2,3],我真的不明白。正如你試圖在分配nums_copy之前設置nums_copy [0],你應該得到一個段錯誤。我想這是由於你編碼的平臺。

-1

給定的代碼使用std::vector,爲什麼不使用它的內置函數?

int removeElement(vector<int>& nums,int val){ 

    vector<int> newNums(); 

     for (int i=0; i<nums.size(); i++){ 
      if (nums[i]!=val){ 
       newNums.push_back(nums[i]); 
      } 
     } 

    return newNums.size(); 
} 
-1
int removeElement(int* nums, int numsSize, int val) { 

    int i, j; 

    for(i = 0, j = 0 ; i < numsSize ; i++){ 
     if(nums[i] == val) continue; 
     nums[ j ] = nums[ i ];    // blind copy 
     j++; 
    } 
    /* 
     nums = realloc(nums, j * sizeof(int)); 
    */ 
    return j; //actual_count 
}