C语言题解 | 去重数组合并数组

news2024/11/28 22:49:27

🌳🌲🌱本文已收录至:C语言题解系列
更多知识尽在此专栏中!
道阻且长,行则将至

欢迎标头


文章目录

  • 🍉前言
  • 🍉正文
    • 🍍去重数组
      • 🍌分析
      • 🍌思路
      • 🍌代码
    • 🍍合并数组
      • 🍌分析
      • 🍌思路
      • 🍌代码
  • 🍉总结


🍉前言

去除数组中重复的元素合并两个数组 也都是很好的题目,都是与 顺序表(数组) 有关的OJ题,适合用来练手,其中 去重数组 是去掉数组中所有重复的元素,确保每个元素都只出现一次;合并数组 指的是合并两个有序数组,合并后的新数组也要确保有序。两题都是简单题,方向对了都很容易做出来。

去重数组去重数组

合并数组合并数组


🍉正文

🍍去重数组

🍌分析

存在一个升序数组 nums ,要求我们 删除数组中的重复元素 ,确保 每个元素只出现一次返回删除后的数组长度 ,并且要 确保原来的元素顺序保持不变 ,这题还有个空间限制要求 O(1)。对于这种需要删除元素的题来说,是少不了 遍历 的,我们可以对数组进行 遍历 ,利用 快慢指针,判断 快指针 是否等于 慢指针如果不相等就赋值,赋值后慢指针才移动,而快指针是始终都在向后走的。当 遍历 结束后,返回 慢指针 - 数组起始位置 + 1 的值,这个值就是删除后数组的长度。

🍌思路

去重算法

🍌代码

//26.删除有序数组中的重复项
//去重算法_快慢指针
int removeDuplicates(int* nums, int numsSize)
{
    int* pfast = nums;  //快指针
    int* pslow = nums;  //慢指针
    //通过源下标,将数组中的元素遍历一遍
    while (numsSize--)
    {
        //如果快指针不等与慢指针,就执行赋值
        if (*pfast != *pslow)
        {
            pslow++;    //需要先将慢指针往后走一步
            *pslow = *pfast;    //赋值
        }
        pfast++;    //快指针始终在移动
    }

    return pslow - nums + 1;    //指针-指针,+1的原因是会漏掉一开始的元素
}

🍍合并数组

🍌分析

合并两个数组首先要清楚一个点:数组在合并后任然有序,我们可以创建一个足够大的数组,然后 对两个有序数组进行比较,选出 较小 的元素放入新数组中(相等就随便放),最后在将新数组拷贝到第一个有序数组 nums1
这个思路实现起来比较容易,但比较啰嗦,而且还浪费空间,我们可以做点小改动:不开辟新数组,从后往前依次找出两个有序数组中的 较大值 ,并将其放入 nums1 中(从后往前)。如果出现 nums2 没有合并完的情况,就需要再额外处理。
这里主要演示第二种思路,不再使用指针,用数组下标的方式实现

🍌思路

合并数组

🍌代码

//88.合并两个有序数组
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    int i1 = m - 1; //nums1的有效尾元素下标
    int i2 = n - 1; //nums2的有效尾元素下标
    int j = m + n - 1;  //nums1的尾元素下标
    //将两个数组中的较小值,从后往前存入nums1
    while (i1 >= 0 && i2 >= 0)
    {
        //情况一
        if (nums2[i2] > nums1[i1])
        {
            nums1[j] = nums2[i2];
            j--;
            i2--;
        }
        else
        {
            //情况二
            nums1[j] = nums1[i1];
            j--;
            i1--;
        }
    }
    //如果nums2中还有数据,就需要单独处理一下
    if (i2 >= 0)
    {
        //如果nums2中还有元素没被合并,就需要单独处理一下
        while (i2 >= 0)
        {
            nums1[j] = nums2[i2];
            j--;
            i2--;
        }
    }
}

🍉总结

以上就是这两到OJ题的详细题解了,因为是动图制作,所以文章篇幅比较短(一张动图做半天,顺便学会了剪辑),现在尝试做动图是为了给后续的 数据结构 做铺垫,因为 数据结构 离开图就会变得非常费解。总之这两题算是结束了,如果你能从中学到知识,那么这篇文章就值了!

如果你觉得本文写的还不错的话,期待留下一个小小的赞👍,你的支持是我分享的最大动力!

如果本文有不足或错误的地方,随时欢迎指出,我会在第一时间改正

星辰大海

相关文章推荐
消失的数字&轮转数组
移除元素(多种解法)
数据结构 | 顺序表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3547.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Allegro基本规则设置指导书之Physical规则设置

Allegro基本规则设置指导书之Physical规则设置 下面介绍规则设置指导书之Physical规则设置 点击Set-up-constraints-Constraint Manager打开规则管理器 设置Physical规则 打开时默认有个Default规则 从左往右 Line Width 最小线宽 最大线宽 Neck 最小线宽 Neck的走线长度 如…

动态内存分配:malloc、calloc、realloc(超详解析,多维度分析,小白一看就懂!!!!)

目录 一、前言 二、动态内存的简单介绍 🍉什么是动态内存分配 🍎为什么要使用动态内存分配 三、动态内存函数的介绍和拓展 🍋malloc()函数 🍊free()函数 🍌calloc()函数 🍇realloc()函数 四、…

UDP套接字编程详解

UDP 是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议。 UDP协议与TCP协议一样用于处理数据包。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之…

【状语从句练习题】综合训练

1. 改正错误 1.第二个 either 改为or 2.后面的 he plays 去掉,不必要的重复 3.but 去掉 4.cold 后 and 5.I went out. 加 个 I. 6.第一个 will 去掉,get 变为 ges 7.so 去掉 8.去掉第二个 either 9.去掉后面的 I need 10.Although/but 去掉一个 11.后…

【JavaSE】类和对象——上

文章目录1. 类的定义1.1 什么是类1.2 如何定义类2. 类的实例化3. this关键字3.1 this访问成员变量和成员方法3.2 构造方法及this()我们给类初始化的方法有:3.2.1 就地初始化3.2.2 使用 set 方法赋值3.2.3 使用构造方法4. 如何便捷的打印对象中属性1. 类的定义 1.1 什…

【Pytorch Lighting】第 1 章:PyTorch Lightning adventure

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

数据中心通识

文章目录一 数据中心定义特点二 机房定义内部物品物理环境三 服务器定义外型分类与PC相比的优点超线程技术固态硬盘和机械硬盘四 网络定义OSI模型局域网的拓扑结构TCP/IP协议常见端口号IP地址介绍、格式、分类、子网掩码DNS三层交换机五 存储格式化缓存RAID技术存储体系架构IP-…

二叉树的前中后序遍历(递归与迭代)

作者:~小明学编程 文章专栏:Java数据结构 格言:目之所及皆为回忆,心之所想皆为过往 目录 简介 前序遍历 递归法 迭代法 中序遍历 递归法 迭代法 后序遍历 递归法 迭代法 简介 前面学习二叉树的时候,已经学过…

渗透测试 | 域名信息收集

0x00 前言 信息收集可以说是在渗透测试中最重要的一部分,上文对 IP 信息收集做了一个简要的叙述,认识了 CDN 技术和网络空间搜索引擎。但是很多网站的主站因为访问流量过大的原因通常会使用 CDN 技术,同时也可以有效防止 DDOS 攻击。在域名信…

前端面经 强缓存与协商缓存

前端面经 强缓存与协商缓存 图片多来自第三方平台 文章目录前端面经 强缓存与协商缓存适用场合浏览器缓存的过程缓存规则强缓存(本地缓存)协商缓存缓存分为两种:强缓存和协商缓存,根据响应的header内容来决定 获取资源形式状态码…

【C++】二叉搜索树

前言 hi~大家好呀,欢迎点进我的C学习笔记~ 我的前一篇C笔记链接~ 【C】多态_柒海啦的博客-CSDN博客 本篇需要用到的基础二叉树C语言实现链接~ 用c语言实现一个简单的链表二叉树_柒海啦的博客-CSDN博客_c语言建立二叉树链表 我们知道,查找一个数据会有很多…

数据库基本操作

目录 数据库操作 创建数据库 查看数据库 选择数据库 删除数据库 注释 数据表操作 创建数据表 查看数据表 查看数据表 查看数据表的相关信息 修改数据表 修改数据表名称 修改表选项 查看表结构 查看数据表的字段信息 查看数据表的创建信息 查看数据表结构 修…

linux进程间通信之共享内存

目录 一,共享内存原理 二,创建共享内存 1,shmget创建共享内存 2,shmat挂接共享内存 3,shmdt取消挂接共享内存 4,shmctl删除共享内存 三,代码使用 1,com.hpp 2,ipc_client.c…

Allegro基本规则设置指导书之Physical Region

Allegro基本规则设置指导书之Physical Region 下面介绍基本规则设置指导书之Physical Region 空白的地方创建一个Region 给新建的Region匹配一个规则,所有区域里面的Physical相关的都按照Region的规则来 当部分网络想按照本身的规则来匹配,可以创建region-Class 然后匹配…

目标检测算法——医学图像开源数据集汇总(附下载链接)

关注”PandaCVer“公众号 深度学习Tricks,第一时间送达 目录 1.血细胞图像数据 2.眼病深度学习数据集 3.皮肤病数据集 4.膝关节 X 射线图像数据集 小海带整理不易,小伙伴们记得一键三连喔!!! >>>一起交流…

VisualSVN 是 Visual Studio 的专业级 Subversion 集成插件

用于 Visual Studio 的 VisualSVN 专业且无缝的 Subversion 集成。 专业级 Subversion 集成 VisualSVN 是 Visual Studio 的专业级 Subversion 集成插件。 VisualSVN 的主要优点是: 无与伦比的可靠性: Visual Studio 永远不会因为 VisualSVN 而崩溃或挂…

保护鲸鱼动物网页设计作业 静态HTML宠物主题网页作业 DW鲸鱼网站模板下载 大学生简单动物网页作品代码 个人网页制作 学生个人网页

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

2022阿里云栖大会,顶尖科技趋势峰会和全链路元宇宙体验

2022年的11月3日-5日是阿里巴巴云栖大会的日子,地点在云栖小镇,本人有幸报名参加了5日那场,因为5日是周六。秉着打工人工作日需要搬砖,因为“公司离不开我”,哈哈哈,实际上是每天满满的工作量。所以只能选择…

一文彻底搞懂协程(coroutine)是什么,值得收藏

什么是协程 我们可以简单的认为:协程就是用户态的线程,但是上下文切换的时机是靠调用方(写代码的开发人员)自身去控制的。 同时,协程和用户态线程非常接近,用户态线程之间的切换不需要陷入内核&#xff0…

NYIST(计科ACMTC)第三次招新赛题解

A题 原文, 原比赛B题 牛客练习赛104【出题人题解】 - 知乎 直接输出 输入的数 就可以了 B题 C题 找到分别处理"无留陀的化身"坐标轴的x轴和y轴, 组合成无留陀的坐标, 再遍历求纳西妲的坐标, 相减即可 /* ⣿⣿⣿⣿⣿⣿⡷⣯⢿⣿⣷⣻⢯⣿⡽⣻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿…