目录
一:题目描述:
二:题目分析:
本题的目的就是让我们在一个无序的数组中,寻找出OJ接口给我们指定的元素,并且将这些数组中的元素都删除,返回最后得到的数组长度。
那我们有以下两种方式来解决此类问题:
1:逐个遍历法
当我们将每个数都遍历一遍,只要发现有我们需要删除的数值的时候,就将后面的所有数往前挪动一位
2:创建新数组来接收
创建一个新的数组来接收删除后的所有元素
3:双指针方法
双指针方法:
当src指向的元素不是Val的时候,src和dest都往后++
当src指向的是指定元素Val的时候,src++,dest不动,
等到src指向最后一个元素的末尾的时候,此时就证明src已经遍历完所有的元素
4:元素移动法
设置一个变量初始值为0,当遇到的元素不是val的话,那就让非val元素放置在初始位置,然后让初始位置往后移动一位,等到遍历完毕的时候,将所有非val的元素走过的初始位置传递过去。
这个方法和上述的双指针法一致。
三:代码实现:
3:双指针方法代码实现:
int removeElement(int* nums, int numsSize, int val){
//nums是传递过来的数组 numsSize就是数组的长度 val是需要被删除的元素
//该题需要传递的参数是一个被修改后的数组的长度
int src = 0;
int dest = 0;
while(src < numsSize){ //src指向的位置都在[0 , numsSize - 1]的区间内,当src指向的位置是numsSize的时候就数 组越界了
if(nums[src] != val){ //当src指向的位置不是指定元素的时候,dest和src都要++
nums[dest] = nums[src]; //在此同时必须先将src指向的非val数值赋值到dest的位置上
src++;
dest++;
}else{ //如果src指定的位置的元素不是val的话,那么此时就需要直接让src自增往后偏移
src++;
}
}
return dest;
}
4:元素移动法:
int removeElement(int* nums, int numsSize, int val){
int count = 0; //计数器:记录非val的数值
for(int i = 0 ; i < numsSize ; i++){
if(nums[i] != val){ //只要数组中的数不是val,
nums[count] = nums[i]; //那就将非val值进行覆盖在数组的最初的位置
count++; //将非val的数值进行++
}
}
return count;
}
希望大家持续关注我的博客,我会定期更新一些LeetCode的刷题解题思路!
感谢大家对我的支持!