【数据结构】链表OJ题(顺序表)(C语言实现)

请添加图片描述

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 追风赶月莫停留 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 平芜尽处是春山🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

📝数据结构OJ题

  • ✏️移除元素
  • ✏️ 删除重复项
  • ✏️ 合并两个数组

✏️移除元素

在这里插入图片描述

题目链接:原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)
我在这里给大家提供了常规的三种解法,第一种解法是错误示范

解法一:大家首先肯定想到的是边遍历边删除,当然这也是常用的方法,但是实际上这个解法一是错误的

int removeElement(int* nums, int numsSize, int val)
{for (int i = 0; i < numsSize; i++){if (nums[i] == val){for (int j = i; j < numsSize - 1; j++){nums[j] = nums[j + 1];}numsSize--;}}for (int i = 0; i < numsSize; i++){if (nums[i] == val){for (int j = i; j < numsSize - 1; j++){nums[j] = nums[j + 1];}numsSize--;}}return numsSize;
}

大家可以看到在这里我用到了两次for循环进行遍历和删除而且是一模一样的,大家可以看下面的图:在这里插入图片描述
会出现两个相邻的数是一样的,如果你把前面的那个9去除了,那么后面那个9就会移到前面那个数的位置,而此时那个位置已经检查过了,所以第二个9就没发删除,就会遗留下来:
在这里插入图片描述
所以这里就采用两次循环就可以解决,但是问题来了,如果是三个相邻的数相同,是不是就得用三个for循环,那如果是四个,五个呢,所以该解法错误的原因在这里。当然你也可以先找到最多有几个相同并且相邻的数的次数,然后再用for循环当然这也可以,但是太复杂了,大家还是看看解法二。

解法二:该解法用了指针

int removeElement(int* nums, int numsSize, int val)
{int* ret = nums;//重新定义一个新的数组空间int sum = 0;while (numsSize){if (*nums != val){*ret++ = *nums++;   //把不同的数移到新的数组空间中sum++;                     //记录新数组的长度}else{nums++;}numsSize--;}return sum;
}

解法二是利用了指针,解法才变得简单起来。

解法三:用了两个变量

int removeElement(int* nums, int numsSize, int val) {int right = 0 ;int left  = 0 ;for (int i = 0; i < numsSize; i++){if (nums[i] != val){nums[left] = nums[right] ;left++;right++;}elseright++;}return left;
}

在这里也是利用两个变量相互移动及赋值,不过这种解法教于指针更容易理解。

✏️ 删除重复项

在这里插入图片描述

题目链接: 删除排序数组中的重复项

解法

int removeDuplicates(int* nums, int numsSize) {int left = 0 ;int right = 0 ;for(int i = 0; i < numsSize-1; i++){if (nums[i] != nums[i+1]){left++;right++;nums[left] = nums[right] ;}elseright++;}return left+1;
}

在这里还是利用了两个变量来记录数组元素的变化及移动,和上一题的解法三还是挺类似的,不过还是有一点差别。因为上一题我们是先赋值再移动,而这一题我们是先移动再赋值。为什么第二题就要先移动再赋值呢,这是因为我们这里是要保留一个,删除重复的,而第一题是直接删除。

✏️ 合并两个数组

在这里插入图片描述

题目链接: 合并两个有序数组

解法

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int m1 = m - 1 ;int n1 = n - 1 ;int sum = m + n - 1 ;while(m1>=0 && n1>=0){if (nums1[m1] > nums2[n1]){nums1[sum] = nums1[m1] ;m1--;sum--;}else{nums1[sum] = nums2[n1] ;n1--;sum--;}}while(n1>=0){nums1[sum] = nums2[n1] ;n1--;sum--;}
}

首先这一题无论是初始的两个数组还是后面合并的数组都是要求数据以递增的形式呈现。

在这里插入图片描述

上幅图中就是题目所给的两个有序数组和一些条件。
按照题目意思我们只能从后面把数据填进去,如果从前面会覆盖一些数据,造成数据丢失。

利用遍历来做,因为题目要求数据是递增的形式。所以只能利用遍历,一边遍历一边比大小。

在这里又要分两种情况:
第一种:n1还有剩余,m1已经分配完了,如下图所示

在这里插入图片描述

在这里插入图片描述
在这里m1是已经为0了,所以会跳出循环,然后直接把nums2中剩余的数补到nums1的前面就可以了。

第二种:m1还有剩余,n1已经分配完了,如下图所示

在这里插入图片描述
在这里插入图片描述
像这种情况就可以直接结束了。

知道这两种情况后,应该就能明白我们后面为什么会加一个循环,就是为了防止第一种情况的出现。

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 一个简单的mixin的运用,对mixin的初步了解

刚学vue的时候&#xff0c;从一个大神口中老是说什么混入混入&#xff0c;觉得很神秘&#xff0c;后来一了解&#xff0c;原来如此&#xff1a; 其实从字面意思来理解&#xff0c;就是将代码里面的内容混在一起了&#xff0c;上一段代码可能比较好理解一点。 先定义一个简单混…

视频剪辑:视频转码实用技巧,批量将MP4转为MP3音频

随着数字媒体设备的普及&#xff0c;视频和音频文件已成为日常生活中的重要组成部分。有时&#xff0c;可能要将MP4视频文件转换为MP3音频文件&#xff0c;以提取其中的音频内容或者进行其他处理。这是耗费时间的任务&#xff0c;那要如何操作呢&#xff1f;本文详解云炫AI智剪…

2023年7月31日 Go生态洞察:探索项目模板实验

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Flink入门之核心概念(三)

任务槽 TaskSlots: 任务槽&#xff0c;是TaskManager提供的用于执行Task的资源&#xff08;CPU 内存&#xff09; TaskManager提供的TaskSlots的个数&#xff1a;主要由Taskmanager所在机器的CPU核心数来决定&#xff0c;不能超过CPU的最大核心数 1.可以在flink/conf/flink-c…

Python configparser 模块:优雅处理配置文件的得力工具

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 配置文件在软件开发中扮演着重要的角色&#xff0c;而Python中的 configparser 模块提供了一种优雅而灵活的方式来处理各种配置需求。本文将深入介绍 configparser 模块的各个方面&#xff0c;通过丰富的示例代码…

Power BI - 5分钟学习透视列

每天5分钟&#xff0c;今天介绍Power BI透视列功能 什么是透视列&#xff1f; 透视列就是把行数据转换成列数据&#xff0c;也就是大家在工作中常说的行转列。 如何进行逆透视操作&#xff1a; 1&#xff0c;导入的【Sales】表&#xff0c;样例内容如下&#xff1a; 2, 【Ho…

20 套监控平台统一成 1 套 Flashcat,国泰君安监控选型提效之路

author:宋庆羽-国泰君安期货 运维工作最重要的就是维护系统的稳定性&#xff0c;其中监控是保证系统稳定性很重要的一环。通过监控可以了解系统的运行状态&#xff0c;及时发现问题和系统隐患&#xff0c;有助于一线人员快速解决问题&#xff0c;提高业务系统的可用时长。 作为…

Javaweb之 IDEA集成Maven的详细解析

03. IDEA集成Maven 我们要想在IDEA中使用Maven进行项目构建&#xff0c;就需要在IDEA中集成Maven 3.1 配置Maven环境 3.1.1 当前工程设置 1、选择 IDEA中 File > Settings > Build,Execution,Deployment > Build Tools > Maven 2、设置IDEA使用本地安装的Maven…

多线程(初阶九:线程池)

目录 一、线程池的由来 二、线程池的简单介绍 1、ThreadPoolExecutor类 &#xff08;1&#xff09;核心线程数和最大线程数&#xff1a; &#xff08;2&#xff09;保持存活时间和存活时间的单位 &#xff08;3&#xff09;放任务的队列 &#xff08;4&#xff09;线程工…

矩阵起源入选IDC《中国大数据管理解决方案技术评估,2023》

近日&#xff0c;矩阵起源作为典型代表厂商入选国际数据公司IDC发布的《中国大数据管理解决方案技术评估&#xff0c;2023》。 在该评估中&#xff0c;IDC认为&#xff0c;矩阵起源超融合异构数据库 MatrixOne 具备如下优势: 将存储、计算、事务三层结解耦&#xff0c;以极致灵…

Python 日志指南

目录 日志指南 日志基础教程 什么时候使用日志 一个简单的例子 记录日志到文件 从多个模块记录日志 记录变量数据 更改显示消息的格式 在消息中显示日期/时间 后续步骤 进阶日志教程 记录流程 记录器 处理器 格式器 配置日志记录 如果没有提供配置会发生什么 …

Ubuntu22.04安装和卸载软件的命令行

一、安装 sudo apt install xxx 二、卸载 sudo apt remove xxx 三、卸载依赖包(可选) 第二步软件卸载之后&#xff0c;有一些依赖包没有被卸载。可以使用sudo apt autoremove xxx来卸载。如果不卸载应该也没什么影响