📜  C |回路和控制结构|问题16(1)

📅  最后修改于: 2023-12-03 14:39:40.114000             🧑  作者: Mango

C语言中的回路和控制结构问题16

在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,......]

解题思路

该问题可以使用双指针法解决,在原数组上按顺序遍历,将不等于目标值的元素依次放到数组的前面,最终返回新数组的长度即可。具体思路如下:

  1. 初始化两个指针 ij 指向数组的起始位置。
  2. 开始遍历数组,如果当前元素等于目标值,则指针 i 不动,指针 j 向后移一位;如果当前元素不等于目标值,则将当前元素赋值给指针 i 指向的位置,并将指针 i 后移一位。
  3. 遍历结束后,指针 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 已经隐含了数组的长度。