当前位置: 首页 > news >正文

【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 索引不增长。

http://www.dtcms.com/a/21239.html

相关文章:

  • 代码随想录算法【Day47】
  • 解决`Illegal group reference: group index is missing`的两种方式
  • 【linux学习指南】⽣产者消费者模型
  • python电影数据分析及可视化系统建设
  • 深度学习在天文观测中的应用:解锁宇宙的奥秘
  • `fi` 是 Bash 脚本中用来结束 `if` 条件语句块的关键字
  • 数位dp入门详解
  • [Vivado报错] [Common 17-55]‘set_property‘ expects at least one object
  • 【数据库维护】Clickhouse数据库维护关键系统表相关指标说明,支撑定位慢SQL及多实例场景下分析各实例运行情况
  • 【Java基础-46.1】Java 中创建自定义泛型类及其应用
  • 【机器学习】常见采样方法详解
  • AtCoder - arc101_b Median of Medians 分析与解答
  • 2009年下半年软件设计师上午真题的知识点整理(附真题及答案解析)
  • Kubernetes-master 组件
  • 25/2/16 <算法笔记> MiDas原理
  • ElasticSearch详解
  • 【开源免费】基于Vue和SpringBoot的美食烹饪互动平台(附论文)
  • 【HUSTOJ 判题机源码解读系列03】judge.cc 源码详细注释
  • 端到端测试利器:Playwright入门教程
  • 力扣 66.加一 (Java实现)
  • ROS应用之SwarmSim在ROS 中的协同路径规划
  • Baklib全场景云平台:一站式知识管理赋能企业效能升级
  • C++11 thread
  • 大模型应用开发书籍推荐
  • 对项目交接的一些思考
  • 通用知识库问答流程
  • vue2.0接入海康威视控件包V3.3.0——海康威视摄像头接入前端页面(webSDK包)模式
  • 【STM32】外部时钟|红外反射光电开关
  • 40、【OS】【Nuttx】OSTest分析(4):内存监控(二)
  • Python进制转换