image-20241030185051296

题目是这样的

image-20241030185107470

这是示例

1. 暴力解决

这道题目直接可以暴力解,用二重循环,第一重遍历寻找数组中等于val的值,第二重将数组中val后面的值全部往前一位,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int removeElement(int *nums,int numsSize,int val)
{
int k=0;
int s=numsSize;
for(int i=0;i<numsSize;i++)
{
if (nums[i]==val)
{
for(int j=i+1;j<=numsSize-1;j++)
{
nums[j-1]=nums[j];
}
k++;
i--;
numsSize--;
}
}
return (s-k);
}

2. 小技巧

因为题目有说明只要让nums的前k个元素包含不等于val,那么我们只要遍历整个数组,然后将!=val的值

提前排序即可,代码如下

1
2
3
4
5
6
7
8
9
10
11
int removeElement(int *nums, int numsSize, int val) {
int k = 0;

for (int i = 0; i < numsSize; i++) {
if (nums[i] != val) {
nums[k] = nums[i];
k++;
}
}
return k;
}

说实话这个应该是最快的,而且思路好像跟下面的快慢指针一样?

JAVA代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public int removeElement(int[] nums, int val) {
int k=0;
for (int i = 0; i < nums.length; i++) {
if(nums[i]!=val){
nums[k]=nums[i];
k++;
}
}
return k;
}
}

3. 快慢指针

看的别人的wp,了解一下快慢指针

1
快慢指针 就是用速度不同的指针(用在链表,数组,序列等上面),来解决一些问题
  • 以本题为例,快慢指针用fastslow两个指针控制,快指针指向当前要和val对比的元素,慢指针指向将被赋值的位置,说实话和上面的小技巧一样的,

  • 思路:

    1
    2
    3
    4
    遍历数组
    如果fast指向的元素 nums[fast]!=val,那么nums[fast]就要输出,把它放到nums[slow]的位置,slow 和 fast 同时向后移动一位。
    如果 nums[fast] == val,证明当前 nums[fast] 是要删除的元素,fast 向后移动一位。
    fast 遍历完整个数组,结束,slow 的值就是剩余数组的长度。

    代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int removeElement(int *nums, int numsSize, int val) {
    int fast=0;
    int slow=0
    for (; fast < numsSize; fast++) {
    if (nums[fast] != val) {
    nums[slow] = nums[fast];
    slow++;
    }
    }
    return slow;
    }

参考题解:ACM 选手图解 LeetCode 移除元素