2016-01-07 103 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 
}