**leetcode 27、移除元素**
[27. 移除元素](https://leetcode.cn/problems/remove-element/)简单
相关标签
相关企业
提示
给你一个数组 nums **和一个值 val,你需要 原地 移除所有数值等于 val **的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:
- 更改
nums数组,使nums的前k个元素包含不等于val的元素。nums的其余元素和nums的大小并不重要。 - 返回
k。
用户评测:
评测机将使用以下代码测试您的解决方案:
int[] nums = [...]; // 输入数组
int val = ...; // 要移除的值
int[] expectedNums = [...]; // 长度正确的预期答案。
// 它以不等于 val 的值排序。
int k = removeElement(nums, val); // 调用你的实现
assert k == expectedNums.length;
sort(nums, 0, k); // 排序 nums 的前 k 个元素
for (int i = 0; i < actualLength; i++) {
assert nums[i] == expectedNums[i];
}
如果所有的断言都通过,你的解决方案将会 通过。
示例 1:
输入: nums = [3,2,2,3], val = 3
输出: 2, nums = [2,2,_,_]
解释: 你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。
你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。
示例 2:
输入: nums = [0,1,2,2,3,0,4,2], val = 2
输出: 5, nums = [0,1,4,0,3,_,_,_]
解释: 你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。
注意这五个元素可以任意顺序返回。
你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。
提示:
0 <= nums.length <= 1000 <= nums[i] <= 500 <= val <= 100
题解: 由于不使用额外空间,可以用双指针原地覆盖。 今天尝试只写函数不写完整程序,如何获得数组大小我想不明白,为什么传入函数首地址和val,size,力扣的审题能自动识别出来呢?(实验后发现,改变参考答案三个传入int的顺序,答案错误,所以力扣是按照顺序识别,第一个必须int* 且是数组首地址,第二个int是size,第三个int是val)
快慢指针的代码实现具体用什么逻辑很难决定
慢指针记录已经整理好的部分数组,快指针能跳过val值,想节省资源,希望在需要调位置时候才进行赋值操作,这样有时候要赋值有时候不赋值,逻辑复杂;直接每个都赋值,适度暴力解决问题,逻辑很简单。
int removeElement(int * num, int size, int val)
{
int fast = 0, slow = 0;
for (fast = 0;fast <= size - 1;fast ++)
{
if (num[fast] != val)
{
num[slow] = num[fast];
slow ++;
}
}
return slow;
}
第一次运行报错: solution.c: In function ‘main’ Line 61: Char 19: error: implicit declaration of function ‘removeElement’; did you mean ‘removElement’? [-Wimplicit-function-declaration] [solution.c] 61 | int ret = removeElement(param_1, size_1, param_2); | ^~~~~~~~~~~~~ | removElement
implicit declaration of function ‘removeElement’是说,未找到removeElement的定义,编译器猜测我想写的是removElement。这句话是leetcode在用测试代码跑我的函数时候,测试代码用的函数名和我定义的查了个字母,所以报错信息找不到的是测试代码里面的函数名,编译器猜测要改成我写的函数名。