前一天学完双指针,今天看到想直接用 定义头指针和尾指针,代码逻辑很好实现,直接模拟即可
class Solution {
public int removeElement(int[] nums, int val) {
int p1 = 0, p2 = nums.length - 1 ;
int count = 0;
while (p1 <= p2) {
if (nums[p1] == val) {
for (int i = p1; i < p2; i++) {
nums[i] = nums[i + 1];//数组中每个元素向前移一位,采用覆盖删除
}
p2--;
count++;//删除的个数
}else {
p1++;
}
}
return nums.length - count ;//留下的元素的个数
}
}
没有问题 就是用了for循环好像让空间使用更多了
更优解就是如果碰到元素相同时 直接把尾指针替换到头指针 这样也不用for循环去完成 妙哉 good
class Solution {
public int removeElement(int[] nums, int val) {
int p1 = 0; // 指向数组开头的指针
int p2 = nums.length - 1; // 指向数组末尾的指针
while (p1 <= p2) {
if (nums[p1] == val) { // 如果当前元素等于目标值
nums[p1] = nums[p2]; // 将末尾的非目标值覆盖当前位置
p2--; // 末尾指针向前移动一位
} else { // 如果当前元素不是目标值
p1++; // 开头指针向后移动一位
}
}
return p1; // 返回非目标值的数量,即新数组的长度
}
}
好家伙 再去看官方题解 一模一样的思路