tag 线性表
数组
删除指定数据
思想
- 假设:val为指定值
- 使first和second首先指向第一个元素
- 如果
second != val
,那么first和second同时前进,并且会进行赋值
- 如果
second == val
,那么second前进,而first则进行等待,直到找到一个second != val
的位置再次执行1
- 重复1-2,直到second达到末尾
- first指向的位置就是删除指定元素之后的数组
代码
public int removeElement(int[] nums, int val) {
if(nums == null || nums.length == 0)
return 0;
int j = 0;
//跳过相等的部分,不等的部分赋值
for(int i = 0; i < nums.length;i++){
if(nums[i] != val){
nums[j] = nums[i];
j++;
}
}
return j;
}
总结
- 特别注意的一点是
nums[j] = nums[i];
的赋值位置,这个for
改成while
可能更好理解
- 总体思想是跳过指定元素,和删除线性表中的重复数据-使用单链表实现的总体思想是一样的
- 注意一点和删除线性表中的重复数据-使用单链表实现的区别
- 为什么删除重复数据first和second指向的不是同一个位置?
因为需要比较,而删除指定数据是不需要再从数组中拿出一个数据进行比较的
- 在删除指定数据和删除重复数据中first起什么作用?
在删除重复数据中,first不仅担任着要记录需要返回的不重复数据的个数,而且还担任着比较的任务;但是在删除指定数据中,first纯粹只是个记录变量,只要second不等于val,就要被强制赋值
网友评论