leetcode27
时间: 2023-11-27 16:05:53 浏览: 34
题目来源:https***-element
题目描述:给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
解题思路:利用快慢指针,快指针p和慢指针q,一直移动p,如果p指向的值不等于给定的val,我们就将值赋给q指向的位置,q后移一位。如果p指向的值等于val了,此时p后移一位就可以了,不做其他操作。
示例代码:
class Solution {
public int removeElement(int[] nums, int val) {
if (nums == null || nums.length == 0) return 0;
int p = 0, q = 0;
while (q < nums.length) {
if (nums[q] != val) {
nums[p] = nums[q];
p++;
}
q++;
}
return p;
}
}
相关问题
LeetCode 27 C++完整实现
以下是 LeetCode 27 题的 C++ 完整实现,包含题目描述和注释:
```c++
/*
题目描述:
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
给定 nums = [3,2,2,3],val = 3,
函数应该返回新的长度 2,nums 中前两个元素均为 2。
示例 2:
给定 nums = [0,1,2,2,3,0,4,2],val = 2,
函数应该返回新的长度 5,nums 中前五个元素为 0、1、3、0、4。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以“引用”方式传递的,这意味着在函数内部修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
解题思路:
使用指针遍历数组,遇到等于 val 的元素就将其覆盖掉,直到遍历完整个数组。
使用另一个指针记录当前已经覆盖掉了几个元素,即新数组的长度。
时间复杂度为 O(n),空间复杂度为 O(1)。
参考链接:
https://leetcode-cn.com/problems/remove-element/
*/
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
int len = 0; // 记录新数组的长度
for (int i = 0; i < n; i++) {
if (nums[i] != val) { // 当前元素不等于 val,可以保留到新数组中
nums[len++] = nums[i]; // 覆盖掉新数组的下一个位置
}
}
return len; // 返回新数组的长度
}
};
```
leetcode27.cpp:29: error: in C++98 'nums' must be initialized by constructor, not by '{...}'
这个错误表示在 C++98 标准下,数组必须通过构造函数初始化,而不能使用 `{...}` 这种方式初始化。你可以尝试使用以下两种方法来解决这个错误:
1. 使用构造函数初始化数组:
```cpp
int nums[] = {1, 2, 3, 4, 5};
```
2. 将编译器设置为支持 C++11 标准或更高:
在 g++ 编译器中,可以使用 `-std=c++11` 或 `-std=c++14` 参数将编译器设置为支持 C++11 或 C++14 标准。例如:
```
g++ -std=c++11 your_program.cpp
```