一、题目:
给你一个数组 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;
}