📅  最后修改于: 2023-12-03 14:39:40.114000             🧑  作者: Mango
在C语言编程中,常常需要使用到回路和控制结构来控制程序的流程和运行。在这里,我们将介绍第16个与回路和控制结构相关的问题。
给定一个整数数组 nums
和一个整数值 val
,请在原地移除所有数值等于 val
的元素,并返回新数组的长度。不要使用额外的数组空间,必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
输入: nums = [3,2,2,3], val = 3 输出: 2, nums = [2,2] 解释: 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素均为 2。因此原数组可以被修改如下: nums = [2,2,......]
该问题可以使用双指针法解决,在原数组上按顺序遍历,将不等于目标值的元素依次放到数组的前面,最终返回新数组的长度即可。具体思路如下:
i
和 j
指向数组的起始位置。i
不动,指针 j
向后移一位;如果当前元素不等于目标值,则将当前元素赋值给指针 i
指向的位置,并将指针 i
后移一位。i
即为新数组的长度。具体的实现代码如下:
int removeElement(int* nums, int numsSize, int val) {
int i = 0, j = 0;
for (; j < numsSize; j++) {
if (nums[j] != val) {
nums[i++] = nums[j];
}
}
return i;
}
该问题可以使用双指针法解决,在原数组上按顺序遍历,将不等于目标值的元素依次放到数组的前面,最终返回新数组的长度即可。需要注意的是,该解法不保证原数组中元素不等于目标值的顺序,因为指针 i
已经隐含了数组的长度。