数组:移除元素
例题27
给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
注意:数组元素在内存地址连续,不能单独删除数组中某元素,只能覆盖。
解题思路:
第一种:
- 拷贝覆盖:把原数组想成空容器,遍历出需要保留的依次填充进去就好了。
class Solution {
public int removeElement(int[] nums, int val) {
int ans = 0;
for(int num: nums) {
if(num != val) {
nums[ans] = num;
ans++;
}
}
return ans;
}
}
作者:guanpengchn
链接:https://leetcode-cn.com/problems/remove-element/solution/hua-jie-suan-fa-27-yi-chu-yuan-su-by-guanpengchn/
第二种:交换移除
- 交换移除:把后面的元素移到前面要移除元素的位置上
class Solution {
public int removeElement(int[] nums, int val) {
int ans = nums.length;
for (int i = 0; i < ans;) {
if (nums[i] == val) {
nums[i] = nums[ans - 1];
ans--;
} else {
i++;
}
}
return ans;
}
}
作者:guanpengchn
链接:https://leetcode-cn.com/problems/remove-element/solution/hua-jie-suan-fa-27-yi-chu-yuan-su-by-guanpengchn/
更多方法
双指针法/ 暴力双for解法具体点这个