【数据结构-初阶】顺序表相关习题

【数据结构-初阶】顺序表相关习题

🎈主页传送门:良木生香

🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》

🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离

上期回顾:在上一篇文章中(【数据结构-初阶】详解线性表(1)---顺序表),我们详细介绍了线性表系列第一种数据结构---顺序表,这个数据结构是以数组为底建立的,也学习了如何用线性表进行增删查改的操作,那么我们今天就用顺序表进行解题~~~

 

题目一:移除元素

这是题目链接:27.移除元素,下面是具体的题目与示例:

由题意知,这道题是想让我们将数组中值为val的元素删除,我们能怎么做呢?

创建新的数组?那不行,题目已经要求我们只能在原地进行操作了,就意味着不能创建新的数组来进行辅助

那该怎么办呢?简单,我们只需用上算法中最基础的---双指针算法了

我们用双指针,不一定用真的指针指向某个元素,有时也可以用下标,讲究的是一种算法思想,并没有一定的形式

我们用两个指针,刚开始都同事之下那个num数组的第一个元素,随后将其中一个指针用于遍历数组,如果两个指针指向的内容不相同,那就将内容进行交换,两个指针同时向后移动一位;如果相同,那就只有遍历的指针移动,下面是示意图:

这时候我们只用在交换的同时用一个变量记录一下,就可以得到数组中值不为val的元素个数了,下面是在平台上的具体代码:

void swap(int* a,int* b) //创建辅助函数,用于交换两个数字 { int temp=0; temp = *a; *a = *b; *b = temp; } int removeElement(int* nums, int numsSize, int val) { int* cur=nums; int* dest = nums; int count=0; while(cur<nums+numsSize) { if(*cur != val) { swap(cur,dest); dest++; count++; } cur++; } return count; }

要注意的是,我们在写交换函数的时候,传入的是地址,不是值,只有传值才能改变元素的值

下面是运行结果:

这是第一道题的题解~~~~

 

 

 

 

题目二:删除数组中的重复项

这是题目链接:26. 删除有序数组中的重复项,下面是具体的题目:

由题意知,这道题是想让我们将数组中重复的元素删除,同样的不能创建新的数组,那就继续使用双指针算法:用两个指针,dest与cur,如果*dest !=*cur,那就交换*dest与*cur的值,两者同时++即可,如果两者指向的元素相等,那就只有cur++,,dest保持不变

 


示意图如下:

以此类推,最后可推出示例的0,1,2,3,4,....,下面是我在平台上提交的代码:

int removeDuplicates(int* nums, int numsSize) { //这道题可以用双指针的方法 int* dest = nums; int* cur = nums+1; while(cur<nums+numsSize){ if(*dest!=*cur){ dest++; *dest = *cur; } cur++; } return dest-nums+1; }

运行结果为:

 

 

 

题目三:合并两个有序数组

这是题目链接:88. 合并两个有序数组,下面是具体题目:

这道题就是想让我们将nums2放到num1里面,然后在对整个nums1进行排序

我们可以先将nums2放到nums1的末尾,再排序,这样确实可以达到目的,时间复杂度是O(n),但是这样就不能达到进阶的要求了,我们还能怎么做呢?小意思,我们可以从nums1最后的地方开始放进去,用三个指针,一个指向nums1非0元素的最后一个元素,一个指向nums1的末尾,一个指向nums2的末尾,如下面的的视频所示:

下面是具体的代码:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) { int* p1 = nums1+m-1; int* p2 = nums2+n-1; int* p3 = nums1+m+n-1; while(p1>=nums1&&p2>=nums2) { if(*p1>*p2) { *p3-- = * p1--; } else *p3-- = *p2--; } while(p2>=nums2) { *p3-- = *p2--; } }

这是运行结果:

 

 

 

那么以上就是顺序表的几道简单算法题的题解啦,感谢大佬们的阅读~~~

 

文章是自己写的哈,有什么描述不对的、不恰当的地方,恳请大佬指正,看到后会第一时间修改,感谢您的阅读。

Read more

OpenClaw 系统架构深度解析

文章目录 * OpenClaw 系统架构深度解析 * 🏗️ 一、架构概览与设计哲学 * 1.1 核心设计原则 * 1.2 整体架构图 * 🔧 二、核心层深度剖析 * 2.1 感知引擎架构 * 2.2 规划引擎架构 * 2.3 执行引擎架构 * 2.4 记忆引擎架构 * 🌐 三、编排层架构 * 3.1 工作流引擎 * 3.2 服务网格与通信 * 📊 四、数据流与状态管理 * 4.1 数据流架构 * 4.2 状态管理架构 * 🔐 五、安全架构 * 5.1 安全架构设计 * 📈 六、可观测性架构 * 6.1

By Ne0inhk
学术翻译神器:Docker+cpolar构建你的跨语言数学文档翻译中枢

学术翻译神器:Docker+cpolar构建你的跨语言数学文档翻译中枢

文章目录 * 前言 * 1. Docker部署 * 2. 简单使用演示 * 3. 安装cpolar内网穿透 * 4. 配置公网地址 * 5. 配置固定公网地址 前言 科研论文中的复杂公式翻译总是格式错乱?英文文献阅读效率低下?传统翻译工具要么无法识别数学符号,要么收费高昂(如DeepL专业版每月40美元)。PDFMathTranslate的出现填补了这一空白——这款开源工具基于LaTeX解析引擎,能精准识别公式、表格等结构化内容,保持翻译后格式零失真。特别适合理工科研究者,其Docker一键部署特性,让非技术用户也能5分钟搭建专属翻译服务。配合cpolar内网穿透,现在手机也能远程提交翻译任务,让学术阅读不再受语言和设备限制。 PDFMathTranslate的核心优势在于数学符号识别与格式保持。它采用多模态解析技术,区分文本与公式区域:文本部分调用AI翻译(支持GPT/LLaMA等模型),公式部分保留LaTeX源码,确保专业术语(如“拓扑空间”“偏微分方程”)翻译准确率达98%,公式格式正确率100%。对比商业工具,其优势在于:1)支持本地部署,数据隐私可控

By Ne0inhk
从零手搓实现 Linux 简易 Shell:内建命令 + 环境变量 + 程序替换全解析

从零手搓实现 Linux 简易 Shell:内建命令 + 环境变量 + 程序替换全解析

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. Shell核心工作流程 * 二. 完整实现源代码 * 2.1 Makefile文件 * 2.2 头文件(myshell.h)和 主函数(main.c) * 2.3 核心实现(myshell.c 优化版) * 三. 核心功能解析 * 3.1 环境变量管理(补充重点) * 3.2 内建命令实现 * 3.3 外部命令执行 * 3.4 关键技术点总结

By Ne0inhk
Docker 部署 Ollama 全流程指南:支持 CPU/GPU、生产环境可用的工程化实践

Docker 部署 Ollama 全流程指南:支持 CPU/GPU、生产环境可用的工程化实践

在上一篇文章中,我们通过本地安装的方式快速跑通了 Ollama,还成功将 DeepSeek 模型运行起来,体验到了大模型本地部署的便捷性。但当你真正把 Ollama 放到团队协作环境、服务器长期运行场景,或是纳入正式项目开发流程时,会立刻发现一个核心问题:本机安装虽简单,却缺乏工程化属性。 本地安装的典型痛点集中在这几点: * 环境易污染,容易出现 CUDA 版本、依赖包的冲突问题 * 机器迁移成本高,换服务器需要重新配置全套环境 * 服务状态不可控,缺乏标准化的启停、监控方式 * 无法无缝接入企业现有运维体系,与容器化、自动化部署流程脱节 也正因如此,在真实的项目落地场景中,Docker 方式部署 Ollama 才是更合理、更可持续的选择。 本文不只是教你把 Docker 版 Ollama “跑起来”,更核心的是带你理解:如何用 Docker 部署 Ollama,让它真正具备工程可用性,适配团队协作与生产级的使用需求。 📌 系列文章 👉 大模型本地部署实践(

By Ne0inhk