用C语言实现数组元素移除(顺序表题)

这篇博客讨论了如何在C语言中,根据给定值val原地修改数组nums,移除所有等于val的元素。博主首先给出了一个直观但不符合题目要求的解题思路,即开辟新空间存放不同元素,然后提供了符合O(1)额外空间要求的解决方案,即从数组开头开始替换不等于val的元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目:

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1:
给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。

二、题目分析及代码:

对于初学C语言的人来说看到这道题首先想到的应该是开辟空间,然后将不等于val的数字放在新空间中,最后将新空间拷贝过去就好。代码如下:

int removeElement(int* nums, int numsSize, int val){
int idex=0;
int *new=(int*)malloc(numsSize*(sizeof(int)));//开辟新空间,和原空间大小一样
for(int i=0;i<numsSize;i++)
{
    if(nums[i]!=val)
    {
        new[idex++]=nums[i];//把不等于val的数字放在新空间中,放了之后新空间的索引idex加一
                            //下一个不等于val的数字就放在新空间第二个位置上
    }
}
memcpy(nums,new,idex*(sizeof(int)));//把新空间中的元素拷贝到原空间中
free(new);//释放malloc开辟的空间
return idex;//新空间中放的数字个数就是不等于val的数字个数
}

虽然可以运行,但是上面方式并不符合题目要求。所以下面有另一种方法,直接将不等于val的元素从数组开头开始放。

int removeElement(int* nums, int numsSize, int val){
int idex=0;//重新开始放元素的索引位置,放几个不等于val的数字,
           //那么这个数字就是几
for(int i=0;i<numsSize;i++)
{
    if(nums[i]!=val)
    {
        nums[idex++]=nums[i];
    }
}
  return idex;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值