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

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

🎈主页传送门:良木生香

🔥个人专栏:《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

如何在VS code中为GitHub Copilot 添加SKill

如何在VS code中为GitHub Copilot 添加SKill

官方链接:Use Agent Skills in VS Code 准备 这里如果要用VS code的Agent Skills记得更新VsCode,下面这个版本及之后的就可以使用 配置Skill Crtl + Shift + P找到设置并打开,搜索chat.useAgentSkills即可 在Github Copilot 聊天框中打开配置自定义智能体,点击+创建新的自定义智能体 之后需要选择是为这个项目创建Skill.md还是所有项目都可用的Skill.md了,之后写入自己的Skill内容就行。 这里是我自己添加的一个Skill.md 添加之后,就会在聊天这里选对应的Skill了,之后就会用这个Skill进行自己的相关分析 使用示例 好啦,快去创建自己的SKill吧!!

By Ne0inhk

10分钟上手Gitolite:从安装到配置的极速入门教程

10分钟上手Gitolite:从安装到配置的极速入门教程 【免费下载链接】gitoliteHosting git repositories -- Gitolite allows you to setup git hosting on a central server, with very fine-grained access control and many (many!) more powerful features. 项目地址: https://gitcode.com/gh_mirrors/gi/gitolite 为什么选择Gitolite? 你是否还在为团队Git仓库的权限管理而烦恼?手动配置SSH密钥和权限不仅耗时,还容易出错。Gitolite(Git托管服务)提供了一种集中管理Git仓库的解决方案,支持细粒度的访问控制和众多强大功能。通过本教程,你将在10分钟内完成从安装到基本配置的全过程,掌握团队协作的必备技能。 读完本文你将学会: * 在服务器上快速部署Gitolite

By Ne0inhk

Top10开源AI视频生成器测评:谁是真正的效率之王?

Top10开源AI视频生成器测评:谁是真正的效率之王? 在AIGC(人工智能生成内容)爆发式增长的今天,AI视频生成技术正以前所未有的速度重塑创意生产流程。从静态图像到动态视频的跨越,不再依赖复杂的后期制作,而是通过“文生视频”或“图生视频”模型一键实现。其中,Image-to-Video(I2V)技术因其低门槛、高可控性,成为个人创作者与中小团队最关注的技术方向之一。 然而,市面上开源的AI视频生成器琳琅满目,性能参差不齐,部署复杂度差异巨大。究竟哪一款真正做到了高质量输出与高效推理的平衡?本文将对当前主流的10款开源AI视频生成项目进行深度实测,涵盖生成质量、推理速度、显存占用、易用性等多个维度,并重点剖析由社区开发者“科哥”二次构建优化的 Image-to-Video 项目,看它是否能问鼎“效率之王”。 📊 测评方法论:五大核心维度全面对比 为确保评测结果客观可量化,我们设定以下五个关键评估维度: | 维度 | 权重 | 说明 | |------|------|------| | 生成质量 | 30% | 视频连贯性、动作自然度、

By Ne0inhk
GitHub 学生认证(保姆级教学)

GitHub 学生认证(保姆级教学)

作为一名嵌入式软件开发工程师,笔者发现Keil MDK 在开发效率上不如 VS Code 高效,因此决定转向 VS Code开发环境。在使用过程中,发现 Copilot的免费使用额度有限,但得益于教育工作者身份,笔者可以享受免费使用权益。特此撰写这篇学生/教师认证指南,希望能帮助更多人顺利获取教育优惠,同时分享使用心得。 一、资源准备 1. 学籍证明         笔者通过大量实践,总结出以下可直接套用的模板,只需替换个人信息即可。 2. 电脑环境         笔者在 Windows 11系统环境下使用 Google Chrome浏览器进行测试。 Google Chromehttps://www.google.cn/chrome/ 二、认证步骤 1. 重置网络配置(Windows)         按下 Win + R 组合键,输入 cmd

By Ne0inhk