力扣8-移除元素

发布于:2025-02-10 ⋅ 阅读:(47) ⋅ 点赞:(0)

一.题目

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k

示例 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 个元素之外留下了什么并不重要(因此它们并不计入评测)。

二.代码

int removeElement(int* nums, int numsSize, int val) 
{
   for(int i=0;i<numsSize;i++)
   {
    if(nums[i]==val)
    {
        for(int j=i;j<numsSize-1;j++)
        {
            nums[j]=nums[j+1];
        }
        numsSize--;
        i--;
    }
   }
   return numsSize;
}

三.代码解释

int removeElement(int* nums, int numsSize, int val) 
{
    // 函数定义,接受一个整数指针 nums 作为数组,numsSize 作为数组元素的数量,val 作为要移除的元素值
    // 函数的返回值是移除元素后的数组的元素数量(即新的数组长度)

    for(int i = 0; i < numsSize; i++)
    {
        // 外层循环,使用 i 作为索引遍历数组
        // 从数组的第一个元素开始,直到数组的最后一个元素

        if(nums[i] == val)
        {
            // 如果当前元素 nums[i] 的值等于要移除的值 val

            for(int j = i; j < numsSize - 1; j++)
            {
                // 内层循环,使用 j 作为索引,从当前元素 i 开始,直到数组的倒数第二个元素
                nums[j] = nums[j + 1];
                // 将当前元素后面的元素向前移动一位,即把 nums[j + 1] 的值赋给 nums[j]
                // 这样就把当前等于 val 的元素覆盖掉了
            }
            numsSize--;
            // 因为移除了一个元素,数组的长度减 1
            i--;
            // i 减 1 是因为后面的元素向前移动了,当前位置的新元素需要重新检查
            // 例如,如果原数组是 [1, 2, 2, 3],要移除 2,当 i = 1 时,第一个 2 被移除后,数组变成 [1, 2, 3]
            // 下一个元素 2 移动到了原来第一个 2 的位置,所以需要重新检查这个位置
        }
    }
    return numsSize;
    // 返回移除元素后的数组的元素数量
}

四.补全代码

#include <stdio.h>

// 函数:从数组中移除指定元素
int removeElement(int* nums, int numsSize, int val) {
    // 外层循环遍历数组
    for (int i = 0; i < numsSize; i++) {
        if (nums[i] == val) {
            // 内层循环将后续元素向前移动一位
            for (int j = i; j < numsSize - 1; j++) {
                nums[j] = nums[j + 1];
            }
            numsSize--;
            i--;
        }
    }
    return numsSize;
}

// 测试函数
int main() {
    int nums[] = {3, 2, 2, 3};
    int val = 3;
    int numsSize = sizeof(nums) / sizeof(nums[0]);
    // 调用 removeElement 函数
    int newSize = removeElement(nums, numsSize, val);
    // 打印移除元素后的数组元素
    for (int i = 0; i < newSize; i++) {
        printf("%d ", nums[i]);
    }
    return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到