1.移除元素
🍎这一道题目要求就地移除目标元素,不能额外申请数组,很明显就是一道双指针题了。
🍌首先可以定义一个快指针(用来记录除去目标以外的其他元素),目的就是为了把所需要的元素给慢指针;那慢指针就是把快指针的值填入数组,再将目标值进行覆盖就行了。
class Solution {
public int removeElement(int[] nums, int val) {
//双指针 原地移除 后一个覆盖前一个
//快指针找出所有需要的元素,然后再给慢指针,遇到与val一样的指进行跳过
int l1 = 0;
int l2 = 0;
for(l1 = 0;l1<nums.length;l1++){
//l1需要遍历完整数组,然后开始判断
if(nums[l1] != val){
nums[l2]=nums[l1];
l2++;
}
}
return l2;
}
}
总结:①先用快指针遍历再目标元素筛选出
②再把需要的交给慢指针存放,把目标值覆盖住就行。
2.删除数组中重复的项
🍎原地操作,删除元素,双指针秒了
🍌这题和上题也比较类似,只是处理的元素的逻辑不咋一样而已。首先定义两个指针,慢指针为第一个数负责填冲快指针数据和删除逻辑,快指针为第二个数负责遍历数组,校验`当两个数不相同时,慢指针进入第二个数进行填充替换。
class Solution {
public int removeDuplicates(int[] nums) {
//前一个和后面一个对比相同就跳过
int l1 = 1;
int l2 = 0;
if(nums == null||nums.length == 0) return 0;
for(l1 = 1;l1<nums.length;l1++){
if(nums[l1]!=nums[l2]){
l2++;//只出现一次,所以直接跳到下一个位置就好了
//然后进行赋值
nums[l2]=nums[l1];
}
}
return l2+1;
}
}
总结:①快指针遍历数组先遍历,
②相同的先跳过,
等到不同时慢指针直接进入下一个位置直接填入覆盖数据就好了
小结
两道题目都是数组原地就地删除,都是用的双指针解法。锻炼的都是代码的实现的基本能力,希望大家多多重复,百炼成钢。