【C语言】移除元素
移除元素
给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
#include <stdio.h>
/**
* RemoveElement函数用于移除数组中所有与指定值相同的元素。
* 通过双指针技术,遍历数组并将不等于指定值的元素移动到数组的前部。
*
* @param nums 数组的指针,数组中的元素类型为char。
* @param numsSize 数组的长度,类型为char,表示数组中元素的数量。
* @param val 指定的值,类型为char,函数将移除数组中所有与该值相同的元素。
* @return 返回移除指定值后数组的新长度,类型为int。
*/
int RemoveElement(char* nums, char numsSize, char val)
{
// 初始化两个指针i和j,它们都从数组的起始位置开始。
int i = 0;
int j = 0;
// 遍历数组中的每个元素。
for (i = 0; i < numsSize; i++)
{
// 如果当前元素不等于指定值,则将其移动到j指针的位置,并将j向前移动。
if (nums[i] != val)
{
nums[j] = nums[i];
j++;
}
}
// 返回新数组的长度,即j的值。
return j;
}
// 主函数
int main()
{
// 初始化一个字符数组,用于后续操作
char arr[]={1,2,3,4,5,1,2,3,4,5};
// 计算数组长度
char arr_Length = sizeof(arr)/sizeof(arr[0]);
// 初始化一个变量len,用于存储数组长度
char len = 0;
// 打印数组长度
printf("%d\n",arr_Length);
// 遍历并打印数组元素
for (int i = 0; i < arr_Length; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
// 调用RemoveElement函数移除数组中特定的元素,并更新数组长度
len = RemoveElement(arr,arr_Length,1);
// 打印更新后的数组长度
printf("%d\n",len);
// 遍历并打印更新后的数组元素
for (int i = 0; i < len; i++)
{
printf("%d ",arr[i]);
}
return 0;
}
采用快指针和慢指针的方法:在 RemoveElement 函数中设置两个索引,分别进行快指引和慢指引,其中 i 为快指引,j 为慢指引。当数组中的元素和目标元素不一样时,进行将 i 索引的数据赋值到 j 索引上,当当数组中的元素和目标元素一样时,不赋值,且 j 索引不增长。