注意:数组中的元素不能删除,只能用其他元素来取代该位置的元素
解法:双指针法
双指针法在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法。
一、快慢指针法: 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
- 快指针:用来循环遍历原数组中的所有元素
- 慢指针: 用来构建新数组,慢指针之前的所有元素就是新数组的元素
代码示例
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0;
for(int fast = 0; fast < nums.length; fast++){
if(nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
}
注意点:
- 用快指针fast遍历数组元素就可以不要再定义变量i来完成循环工作了, fast就能完成此任务
- 注意最后一次执行if逻辑时,slow仍++,因此是return slow,而不是return slow + 1
二、相向指针法
class Solution {
public int removeElement(int[] nums, int val) {
int left = 0;
int right = nums.length - 1;
while(right >= 0 && nums[right] == val){
right--;
} //将right移到从右数第一个值不为val的位置
while(left <= right) {
if(nums[left] == val) { //left位置的元素需要移除
nums[left] = nums[right];//用right位置的元素取代left(覆盖)
right--;
}
left++;
while(right >= 0 && nums[right] == val){
right--;
} //将right继续往左移到不为val的位置
}
return left;
}
}