如何删除数组中的某个元素?

简介: 如何删除数组中的某个元素?

如何删除数组中的某个元素?

例:给你一个数组 nums 和一个值 val,你需要移除所有数值等于 val 的元素,并返回移除后数组的新长度。

三种方法

1.元素前移(时间复杂度:O(N^2),空间复杂度:O(1))

遍历数组,当遇到需要删除的元素时,则将其后面的元素全部前移一个空间,覆盖当前需要删除的元素。前移后下标不变,需要再次判断当前位置的元素是否为要删除元素。

int removeElement(int* nums, int numsSize, int val)
{
    int newnumsSize = numsSize;
    for (int i = 0; i < numsSize; i++)
    {
        if (nums[i] == val)
        {
            newnumsSize--;
            for (int j = i; j < numsSize - 1; j++)
                nums[j] = nums[j + 1];
            i--;//后一元素前移后该元素仍要判断是否为val
        }
    }
    return newnumsSize;
}
int main()
{
    int nums[] = { 3,2,6,6,6,6,7,8,9 };
    int newnumsSize = removeElement(nums, 9, 6);
    for (int i = 0; i < newnumsSize; i++)
        printf("%d ", nums[i]);
    return 0;
}

2.快慢指针(额外数组,空间换时间)(时间复杂度:O(N),空间复杂度O(N))

创建一个快指针、一个慢指针和一个数组。通过快指针遍历原数组,只要遇到的元素不等于val,那么就将该元素通过慢指针赋值到新数组中。这样快指针遍历完成后,新数组中的元素就是不包含val的元素,再将新数组的元素赋值到原数组中,即可完成删除val。

int removeElement(int* nums, int numsSize, int val)
{
  int* newnums = (int*)malloc(sizeof(int) * numsSize);//建立新数组
  int fast = 0;
  int slow = 0;
  for (fast = 0; fast < numsSize; fast++)
  {
    if (nums[fast] != val)
    {
      newnums[slow] = nums[fast];
      slow++;
    }
  }
  for (int i = 0; i < slow; i++)//将新数组赋值到原数组中
  {
    nums[i] = newnums[i];
  }
  return slow;
}
int main()//测试
{
  int nums[] = { 3,6,6,6,6,7,8,9,10,11 };
  int newnumsSize = removeElement(nums, 10, 6);
  for (int i = 0; i < newnumsSize; i++)
  {
    printf("%d ", nums[i]);
  }
  return 0;
}

3.快慢指针(非额外数组)(时间复杂度:O(N),空间复杂度O(1))

创建一个快指针和一个慢指针,不再创建新的数组,而是直接在原数组中进行元素的赋值拷贝。(本质其实和额外数组相同,只是将不等于val的元素拷贝到原数组中,这样val元素就会被覆盖或者在数组新长度的界外)通过快指针遍历数组, 如果快指针遍历遇到不等于 val 的元素,则将该元素赋值到慢指针指向的位置,且慢指针位置后移。这样遍历完成后,数组中的val元素就会被“删除”

int removeElement(int* nums, int numsSize, int val)
{
    int fast = 0;
    int slow = 0;
    for (fast = 0; fast < numsSize; fast++)
    {
        if (nums[fast] != val)
        {
             nums[slow] = nums[fast];
             slow++;
        }  
    }
    return slow;
}


目录
相关文章
|
消息中间件 存储 大数据
一文读懂kafka的幂等生产者
一文读懂kafka的幂等生产者
|
5月前
|
C++
爱心代码 C++
这段C++代码使用EasyX图形库生成动态爱心图案。程序通过数学公式绘制爱心形状,并以帧动画形式呈现渐变效果。运行时需安装EasyX库,教程链接:http://【EasyX图形库的安装和使用】https://www.bilibili.com/video/BV1Xv4y1p7z1。代码中定义了屏幕尺寸、颜色数组等参数,利用随机数与数学函数生成动态点位,模拟爱心扩散与收缩动画,最终实现流畅的视觉效果。
790 0
|
9月前
|
人工智能 自然语言处理 监控
大语言模型的解码策略与关键优化总结
本文系统性地阐述了大型语言模型(LLMs)中的解码策略技术原理及其应用。通过深入分析贪婪解码、束搜索、采样技术等核心方法,以及温度参数、惩罚机制等优化手段,为研究者和工程师提供了全面的技术参考。文章详细探讨了不同解码算法的工作机制、性能特征和优化方法,强调了解码策略在生成高质量、连贯且多样化文本中的关键作用。实例展示了各类解码策略的应用效果,帮助读者理解其优缺点及适用场景。
894 20
大语言模型的解码策略与关键优化总结
|
存储 JavaScript 前端开发
PicGo+Gitee+Typora实现一键上传md到csdn
PicGo+Gitee+Typora实现一键上传md到csdn
253 0
|
机器学习/深度学习 搜索推荐 人机交互
智能语音识别技术的现状与未来发展趋势####
【10月更文挑战第29天】 本文深入探讨了智能语音识别技术的发展历程、当前主要技术特点、面临的挑战及未来发展趋势。通过综述国内外最新研究成果,分析了深度学习在语音识别领域的应用现状,并展望了多模态融合、端到端建模等前沿技术的潜在影响。文章还讨论了隐私保护、数据安全等问题对技术发展的影响,以及跨语言、跨文化适应性的研究方向。 ####
|
机器学习/深度学习 人工智能 自然语言处理
深度剖析深度神经网络(DNN):原理、实现与应用
本文详细介绍了深度神经网络(DNN)的基本原理、核心算法及其具体操作步骤。DNN作为一种重要的人工智能工具,通过多层次的特征学习和权重调节,实现了复杂任务的高效解决。文章通过理论讲解与代码演示相结合的方式,帮助读者理解DNN的工作机制及实际应用。
|
设计模式 Java 数据库
【设计模式】JAVA Design Patterns——Converter(转换器模式)
转换器模式旨在实现不同类型间的双向转换,减少样板代码。它通过通用的Converter类和特定的转换器(如UserConverter)简化实例映射。Converter类包含两个Function对象,用于不同类型的转换,同时提供列表转换方法。当需要在逻辑上对应的类型间转换,或处理DTO、DO时,此模式尤为适用。
【设计模式】JAVA Design Patterns——Converter(转换器模式)
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的家政服务管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的家政服务管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
263 2
|
SQL 流计算
[尚硅谷 flink] 基于时间的合流——双流联结
[尚硅谷 flink] 基于时间的合流——双流联结
229 1
|
域名解析 网络协议 网络安全
WordPress搭建个人博客
这篇文章将手把手地指导你如何快速完成WordPress的搭建。你可以利用WordPress搭建个人博客,甚至企业官方网站。只要你跟着本文的步骤走,即使小白也能轻松搞定WordPress网站搭建。首选你需要购买一个vps,并将你的域名解析到vps;然后连接你的VPS,在vps上执行命令一键安装WordPress;再接下来就是初始化你的WordPress了,安装Argon模板、安装RankMath SEO插件、安装webp图片速度优化插件
803 2
WordPress搭建个人博客