要知道数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
1.使用两层 for
循环来解决 LeetCode 27 题(移除元素),可以通过外层循环遍历数组,内层循环将后面的元素向前移动。以下是基于这种思路的 C++ 实现:
#include <vector>
class Solution {
public:
int removeElement(std::vector<int>& nums, int val) {
int n = nums.size();
for (int i = 0; i < n; i++) {
if (nums[i] == val) {
// 内层循环将后面的元素向前移动
for (int j = i + 1; j < n; j++) {
nums[j - 1] = nums[j];
}
n--; // 数组长度减 1
i--; // 因为当前元素被覆盖,需要重新检查当前位置
}
}
return n;
}
};
2.快慢指针用 fast 和 slow 两个指针控制,快指针 fast 指向当前要和 val 对比的元素,慢指针 slow 指向将被赋值的位置:
-
遍历数组。
-
如果 fast 指针指向的元素 nums[fast] != val,则 nums[fast] 是输出数组的元素,将其赋值到 nums[slow] 的位置,slow 和 fast 同时向后移动一位。
-
如果 nums[fast] == val,证明当前 nums[fast] 是要删除的元素,fast 向后移动一位。
-
fast 遍历完整个数组,结束,slow 的值就是剩余数组的长度。
#include <vector> class Solution { public: int removeElement(std::vector<int>& nums, int val) { int i = 0; // 慢指针 for (int j = 0; j < nums.size(); j++) { // 快指针 if (nums[j] != val) { nums[i] = nums[j]; i++; } } return i; } };