题目链接:https://leetcode.com/problems/remove-element/#/description
题目要求:删除数组中的指定数,返回删除该数之后的数组长度
思路:使用一个标记“指针”记录下一个不会被删除的元素应该保存的位置。
实例:原数组为2,3,3,3,4,5,3,6 指定要删除的数字为3
(使用“|”来表示上述提到的标记指针,“|”之后的数所处的位置为下一个下一个不会被删除的元素应该保存的位置)
(红色字体表示下一步要处理的数字)
过程如下:
(1)数组的初始状态:| 2,3,3,3,4,5,3,6
(2)数组的第一个数字是2,不应该删除,因此标记指针后移一位,数组变为2, | 3,3,3,4,5,3,6(该步骤其实也有一次赋值,将数字2赋值到它的正确位置,也就是第一个位置)
(3)数组的第二个数字是3,应该删除,因此标记指针不动,表示下一个不应该删除的数应该保存到 | 后面的位置(也就是被删掉的3的位置),数组状态依旧为2, | 3,3,3,4,5,3,6
(4)数组的第三个数字是3,应该删除,因此标记指针还不动,表示下一个不应该删除的数应该保存到 | 后面的位置,数组的状态依旧为2, | 3,3,3,4,5,3,6
(5)数组的第四个数字是3,应该删除,因此标记指针还不动,表示下一个不应该删除的数应该保存到 | 后面的位置,数组的状态依旧为2, | 3,3,3,4,5,3,6
(6)数组的第五个数字是4,不应该删除,因此将4复制到它的正确位置,也就是 | 后面的位置,同时标记指针后移一位。数组的状态变为2, 4, | 3,3,4,5,3,6
(7)数组的第六个数字是5,不应该删除,因此将5复制到它的正确位置,也就是 | 后面的位置,同时标记指针后移一位。数组的状态变为2, 4, 5, | 3,4,5,3,6
(8)数组的第七个数字是3,应该删除,因此标记指针不动,表示下一个不应该删除的数应该保存到 | 后面的位置,数组的状态为2, 4, 5, | 3,4,5,3,6
(9)数组的第八个数字是6,不应该删除,因此将6复制到它的正确位置,也就是 | 后面的位置,同时标记指针后移一位。数组的状态变为2, 4, 5, 6, | 4,5,3,6
至此,处理过程结束,| 所处的位置的下标,即为删除指定数字之后,数组的长度。
Java代码如下:
public class Solution {
// 删除数组中的指定值
public int removeElement(int[] nums, int val) {
int rightIndex = 0;
// 使用一个“指针”记录下一个不该删除的元素应该保存的位置
for(int i=0; i<nums.length; i++){
if(nums[i] != val){
// 遍历数组时,如果当前数字不是val,也就是不该删除,将它赋值到它应该保存到的位置,然后将rightIndex后移一位
// 换句话说,如果当前数字是val,那么当前数字应该被之后的某个数覆盖掉,所以这种情况下rightIndex指针不必移动。
nums[rightIndex] = nums[i];
rightIndex ++;
}
}
// 遍历结束后,rightIndex的值即为删除指定值之后,数组中有效的元素个数
return rightIndex;
}
}