2016-01-07 2 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 

РЕШЕНИЕ Один подход заключается в следующем

Повтор:

Начните с двух маркеров (или индекс или указатель) один указательного к самому левому и один к самому правому элементу

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. Используйте malloc от stdlib, чтобы выделить переменное количество памяти на куче, или 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 [0], прежде чем назначить nums_copy, вы должны получить segfault. Полагаю, это из-за платформы, на которой вы кодируете.

-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 
} 
Смежные вопросы