408强化(二)线性表纯享版
目录
一、顺序表(数组)和链表总览
二、考情分析
2.1 从历年考情可以看出,如果一个方法出现了第2次,一般是以下情况:
2.2 没有考过的地方
三、 共同操作或考法
3.1 多指针后移
3.2 逆置
3.3 空间换时间的操作
3.4 只保留首次出现的元素(共同考法)
3.4 排序
四、独有操作或考法
4.1 在顺序表中遍历,找到符合要求的元素并删除
4.2 判断单链表是否存在环
4.3 找到两个链表中的共同结点
红色字体为线性表的共同操作, 蓝色背景为下文有模板。绿色字体为统计的考频分析(易想到不饶弯子的)
一、顺序表(数组)和链表总览
第一步:看到题目,分析情况
- 多指针后移 2010较优解; 2020年最优解(三指针)
- 以空间换时间 2018
- 排序或排序后利于操作 2013较优解; 2016暴力解
- 逆置 2010最优解(三次逆置)
- 折半查找 2011最优解
- 删除、插入
- 只保留首次出现的元素
第二步:分析坑
- 表长是奇数或偶数时需讨论
- 空表怎么处理
第一步:看到题目,分析情况
- 多指针后移
- 以空间换时间 2015
- 排序
- 头插法逆置 2019
- 前后指针 2012最优解
- 快慢指针
- 只保留首次出现的元素
第二步:分析坑
- 头插法是逆序建立链表,尾插法是正序建立链表
- 单链表只能向后查找,故可能需要前驱指针
- 不可修改链表结构
- 有free()操作
- 需malloc()结点
- 注意是否有头结点
- 不同于数组改变下标,链表是p=p->next,本质一样
二、考情分析
2.1 从历年考情可以看出,如果一个方法出现了第2次,一般是以下情况:
- 升级版。2011年能用二指针后移,2020年需要设置三指针后移。
- 数组考过,换到链表考。如2015年和2018年都是以空间换时间
- 太过重要。如快排,是某一年的解的一部分。2013年是较优解,2016年是暴力解。
2.2 没有考过的地方
数组的插入删除;链表的多指针后移;不使用数组进行链表排序。都具有很大的考察可能。
2021,2022,2023年为图,二叉树,图。2018,2019,2020年都是线性表,2024年很可能回归线性表。
三、 共同操作或考法
3.1多指针后移
条件:多个线性表;有序。
- 归并链表或数组,使之有序。
- 归并的升级操作:找到两个序列中的相同元素或其他,本质仍是比大小,改变的是比的内容或对结果的操作。
多指针后移常用于有序线性表(顺序表和链表都可以),如果考试中给出有序的线性表,优先考虑这种方式,这种方式可以用于合并多个有序线性表、查找共同排序后第k个大小的元素等等,归并排序就是用到了这种思想。
归并两个升序数组
void Merge(int A[], n, B[], m){ //数组A、B长度分别为n、mint C[n+m]; //新数组int pa=pb=k=0; //pa、pb作为遍历A、B的下标while (pa<n && pb<m) //直到有一个数组遍历完if (A[pa]<B[pb]) //将小的那个数存入C数组C[k++]=A[pa++];else C[k++]=B[pb++];for (; pa<n; i++)C[k++]=A[pa]; //将A中剩余的数存入C数组for (; pb<m; j++)C[k++]=B[pb]; //将B中剩余的数存入C数组 }
归并两个升序链表,结果存放在LA中,使之降序。
void MergeList (LinkList &La,LinkList &Lb){ LNode *pa=La->next,*pb=Lb->next; //分别是工作指针 LNode *r;//头插法防止断链需要的指针 La->next=NULL; //结果链表初始化为空 while(pa!=NULL&&pb!=NULL) if(pa->data<=pb->data){ r=pa->next; //r暂存pa的后继指针 pa->next=La->next; La->next=pa; pa=r; //恢复pa为当前待比较结点 } else{ r=pb->next; //r暂存pb的后继指针 pb->next=La->next; La->next=pb; pb=r; //恢复pb为当前待比较结点 } if(pa!=NULL) pb=pa //pa不空的将原La剩余元素继续前插进结果链表La,这里用到了一个小技巧 while(pb!=NULL){ //pb不空的话将Lb剩余元素继续前插进结果链表La r=pb->next; pb->next=La->next; La->next=pb; pb=r; } free(Lb); //将最后只剩下的一个Lb头结点free掉 }
归并两个升序链表,结果存放在LA中,使之升序
void Merge(LinkList *La, *Lb){ LNode *pa=La->next, *pb=Lb->next; //pa、pb指向L1、L2第一个元素LNode *r=La; //新链表头节点为La,r指向末尾LNode *par, *pbr; //用来暂存pa->next和pb->nextwhile (pa!=null && pb!=null) //直到有一个链表遍历完if (pa->data<pb->data){ //将小的那个数存入新链par=p->next; //par为pa下一个元素r->next=pa; //pa插入到r后面pa->next=NULL; //这是新链最后一个元素r=pa; //尾指针r指向最后一个元素pa=par; //pa指向pa下一个元素}else{ pbr=pb->next; //pbr为pb下一个元素r->next=pb; //pb插入到r后面pb->next=NULL; //这是新链最后一个元素r=pb; //尾指针r指向最后一个元素pb=pbr; //pb指向pb下一个元素}if (pa!=null)r->next=pa; //将剩余部分连到r后面if (pb!=null)r->next=pb; //将剩余部分连到r后面//La是合并后的升序链表,注意最后此时r已经不是指向新链表尾元素的指针了
3.2逆置
顺序表
数组可以任意下标到任意下表逆置
void Reverse(int low,int high,Sqlist *L){ElemType temp; //用于暂存for(int i=0;i<(high-low+1)/2;i++){//注意边界条件,交换对应位置元素temp=L.data[low];L.data[low]=L.data[high];L.data[high]=temp;}}
链表
链表用头插法逆置
LinkList Reverse(LinkList L){LNode *p,*r; //p为工作指针,r为p的后继结点指针p=L->next;L->next=NULL; //先断开头结点while(p!=NULL){ r=p->next;p->next=L->next; L->next=p; //将p结点插入到头结点后,第一个结点插入时即为尾结点p=r; //工作指针后移}return L;}
3.3 空间换时间的操作
空间保存状态。原序列最多只有n种情况,设置一个大小为n,初始值为0的数组A[n-1]用于保存这些情况。遍历一遍序列将出现的情况对于的数组置1。
3.4 只保留首次出现的元素(共同考法)
顺序表课后第06题
链表课后第12题
3.4 排序
传统数组排序
快速排序的平均时间复杂度是O(nlogn),平均空间复杂度是O(logn),是考试中最快的不稳定排序算法,一般要用到排序时都使用快速排序。快速排序的最坏时间复杂度是O(n2),最坏空间复杂度都是O(n),但我们只需要加一个小优化就能避免最坏情况:即随机选择一个元素作为枢值。优化后最坏时间复杂度O(nlogn),最坏空间复杂度O(logn)。
(注:快速排序有很多写法,交换式和挖坑式,不同写法中间过程不一样但只要能实现排序即可,本代码适用于算法大题,方便记忆)
代码如下:void Qsort(int A[], L, R){ //a数组保存数据,L和R是边界if (L>=R) return; //当前区间元素个数<=1则退出int pivot, i=L, j=R; //i和j是左右两个数组下标移动把A[L~R]中随机一个元素和A[L]交换 //快排优化,使得基准值的选取随机pivot=A[L]; //pivot作为基准值参与比较while (i<j){while (i<j && A[j]>pivot)j--;while (i<j && A[i]<=pivot)i++;Rif (i<j)swap(A[i], A[j]); //交换A[i]和A[j]}swap(A[L], A[i]); //将基准值放入他的最终位置 /*此时A[L~i-1]<=A[i]<=A[i+1~R]*/Qsort(A, L, i-1); //递归处理左区间Qsort(A, i+1, R); //递归处理右区间}
单链表排序
- 使用O(n)大小的辅助数组,进而可以使用第7章的排序算法,最后重置链表的结点数据域。
- 直接插入排序思想,代码如下:
void Sort(LinkList &L){LNode *p=L->next,*pre;LNode *r=p->next;p->next=NULL; //构造只含一个数据结点的有序表p=r;while(p!=NULL){ //每次插入一个结点并使链表有序r=p->next;pre=L; //将pre置于头结点,用于循环找到插入的合适位置while(pre->next!=NULL&&pre->next->data<p->data) pre=pre->next;p->next=pre->next; pre->next=p; //将*p插入到*pre之后p=r; //工作指针迭代}//第一个while}//void
四、独有操作或考法
4.1 在顺序表中遍历,找到符合要求的元素并删除
两种方法
- 用count记录已保存的元素个数,遍历时将需要保存的元素移动到下标count的位置,并更新count值
- 用count记录已删除的元素个数,遍历时更新count,或者将需要保留的元素前移count
两种方法结束后都要修改L.length
- L.length=count;
- L.length-=count;
4.2 判断单链表是否存在环
如果有环,快指针早晚追上慢指针
课后21题
4.3 找到两个链表中的共同结点
1)对齐后(前后指针),同时扫描两链表
2)for循环枚举
咸鱼学长统计,我在这里保存一下方便查看
相关文章:
408强化(二)线性表纯享版
目录 一、顺序表(数组)和链表总览 二、考情分析 2.1 从历年考情可以看出,如果一个方法出现了第2次,一般是以下情况: 2.2 没有考过的地方 三、 共同操作或考法 3.1 多指针后移 3.2 逆置 3.3 空间换时间的操作 3.…...
ubuntu下如何使用wireshark抓包,保姆级教程
Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是截取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。 一、安装wireshark 打开终端&…...
世界上最健康的程序员作息表!「值得一看」
昨晚看了一篇“传说中”的“世界上最健康的作息时间表”,开始纠结自己还要不要5点半起床。 都说程序员这一行,猝死概率极高,究其原因还是加班太狠、作息不规律、缺乏运动… 今天和大家分享一下这篇文章,还是非常值得参考的&#…...
Java中多继承的实现
1 问题Java是一种面向对象的只允许单继承的语言,那么怎样在Java中实现多继承呢?2 方法多层继承如果要直接继承类,子类是不可以直接多继承的,但是可以通过多层继承来实现多继承,但多层继承一般不建议超过三次。接口接口…...
蓝桥杯 stm32 USART 串口发送数据
文章代码使用 HAL 库。 文章目录 前言一、串口原理图二、CubeMX 创建工程。三、串口发送函数:四、串口助手 配置:五、详细代码:注意:连续发送数据六、printf 重定向问题代码示例:实验效果:总结前言 USART : ( Universal Synchronous/Asynchronous Receiver/Transmitter…...
Spring之AOP底层源码解析
Spring之AOP底层源码解析 1、动态代理 代理模式的解释:为其他对象提供一种代理以控制对这个对象的访问,增强一个类中的某个方法,对程序进行扩展。 举个例子 public class UserService {public void test() {System.out.println("test.…...
人脸识别——景联文科技提供3D头模数据采集业务!
“拿起手机刷脸解锁、上下班考勤、支付订单,刷脸已极大地便利了我们的生活。清华大学新闻学院教授沈阳表示,中国人平均每天要暴露在各种摄像头下超过500次。人脸识别已成了我们生活中重要的一部分。由于2D人脸识别容易受到姿态、表情、光照等因素影响&am…...
SpringBoot集成Flink-CDC 采集PostgreSQL变更数据发布到Kafka
最近做的一个项目,使用的是pg数据库,公司没有成熟的DCD组件,为了实现数据变更消息发布的功能,我使用SpringBoot集成Flink-CDC 采集PostgreSQL变更数据发布到Kafka。 一、业务价值 监听数据变化,进行异步通知…...
酷开系统壁纸模式,将氛围感死死拿捏!
古希腊哲学家柏拉图曾经说过:“美感是起于视觉、听觉产生的快感,以人的感官所能达到的范围为极限。”而电视则恰恰就是视觉听觉的完美融合体,当一台开启的电视可以给我们带来视听享受的时候,一台待机状态下的电视又如何取悦于我们…...
第0章 一些你可能正感到迷惑的问题
操作系统是什么 操作系统是控制管理计算机系统的硬软件,分配调度资源的系统软件。 由操作系统把资源获取到后台给用户进程,但为了保护计算机系统不被损坏,不允许用户进程直接访问硬件资源。 操作系统相当于是一个分配资源的机构,…...
MYSQL实战
SQL的处理 缓存解析查询优化(查询优化器) 重写查询;表的读取顺序;选择索引1.不要在索引上做任何操作 表达式函数 2.尽量全值匹配 联合索引中搜素条件后会根据最优条件排序进行查询,联合索引尽量都使用起来。搜索条…...
少儿户外拓展北斗定位解决方案
一、项目背景户外拓展训练是指通过专业的机构,对久居城市的人进行的一种野外生存训练。拓展训练通常利用崇山峻岭、翰海大川等自然环境,通过精心设计的活动达到“磨练意志、陶冶情操、完善人格、熔炼团队”的培训目的。针对户外拓展人员安全管理存在的实…...
更换ssl证书
更换ssl证书常用证书查看以及转换网址阿里云判断流量以及配置证书判断接入点阿里云控制台配置证书WAFAzure判断流量以及配置证书:判断接入点Azure配置证书CDNAPP GateWay常用证书查看以及转换网址 https://www.chinassl.net/ssltools/convert-ssl.htmlhttps://myss…...
线程池源码解析项目中如何配置线程池
目录 基础回顾 线程池执行任务流程 简单使用 构造函数 execute方法 execute中出现的ctl属性 execute中出现的addWorker方法 addWorker中出现的addWorkerFailed方法 addWorker中出现的Worker类 Worker类中run方法出现的runWorker方法 runWorker中出现的getTask runWo…...
Echarts 更改K线度颜色,解释K线图4个数字意义
第019个点击查看专栏目录本示例修改K线度的颜色,方法参考源代码。 这里面讲一下K线图的四个数字,如[20, 34, 10, 38], 第一位:20代表开盘价格, 第二位:34代表闭盘价格, 第三位:10代表最低价&…...
JavaScript和Java两种方法实现百度地图和高德、腾讯地图的相互转换
目录一、常见的经纬度标准二、百度地图和高德、腾讯地图经纬度的转换1、前端JavaScript转换2、后端Java实现转换一、常见的经纬度标准 高德、腾讯(使用GCJ02) GCJ-02坐标系,也称火星坐标系,由中国国家测绘局在02年发布࿰…...
Vue中常见的几种组件间通信方法
1.props(父传子) 父组件Parent.vue <template><child :msg"message"></child> </template>父组件通过:val"value"的形式定义要传给子组件的值value绑定到val上 子组件Child.vue export default {//写法一…...
Outcome VS. Output:研发效能提升中,谁会更胜一筹?
2007 年,网景通信公司(Netscape)的联合创始人 Marc Andreessen 在博客 The Pmarca Guide to Startups 中提出 「Product/Market Fit」 ,他写道, 「这意味着在一个良好的市场中,拥有能够满足该市场的产品。」…...
ptp4l与phc2sys进行系统时钟同步
linuxptp用于时钟同步。安装采用apt install linuxptp主要包含2个程序,ptp4l 进行时钟同步,实时网卡时钟与远端的时钟同步,支持1588 和 802.1AS 两种协议phc2sys 将网卡上的时钟同步到操作系统,或者反之命令demo:某主机P通过eth2连…...
使用注解JSON序列化
JsonSerialize(using ToStringSerializer.class) 将返回数据转成String序列化 JsonFormat(pattern "yyyy-MM-dd hh:mm",timezone"GMT8") 将日期数据转换成特定格式 使用JsonSerialize自定义注解接口 定义接口 import java.lang.annotation.ElementTyp…...
kubernetes教程 --Pod生命周期
Pod生命周期 pod创建过程运行初始化容器(init container)过程运行主容器(main container)过程 容器启动后钩子(post start)、容器终止前钩子(pre stop)容器的存活性探测(…...
高校房产管理系统用到了哪些技术?
数图互通高校房产管理系统是基于公司自主研发的FMCenterV5.0平通过在中国100多所高校的成功实施和迭代,形成了一套成熟、完善、全生命周期的房屋资源管理解决方案。台,是针对中国高校房产的管理特点和管理要求,研发的一套标准产品;…...
【Python学习笔记】37.Python3 MySQL - mysql-connector 驱动(2)
前言 本章继续介绍MySQL - mysql-connector 驱动。 where 条件语句 如果我们要读取指定条件的数据,可以使用 where 语句: demo_mysql_test.py 读取 name 字段为 CSDN 的记录: import mysql.connectormydb mysql.connector.connect(host…...
【高级Java】高级Java实验
一、反射与动态代理1、(4分)请通过反射技术,为附件中的Person.class生成相应的.java代码,java代码中的方法的方法体为空,即方法内部代码不用生成。请注意生成的java代码的格式。2、(3分)请为第1…...
SYN480R 解码
目录1.空载情况下2.当有按键被按下3.数据帧分析4.同步码5.数据码6.对24位数据帧分析1.空载情况下 在空载情况下,syn480r 输出引脚,输出的是杂乱无序的波形 2.当有按键被按下 按下按键,会连续输出相同的脉冲波形,放大分析 3.数据…...
ASP .NET(基于.NET 6.0)源码解读
这几天一直在琢磨在我现有技术认知基础上,未来如何做技术提升。 日思夜想,我整理出了我自己的一套学习规划方案,并希望在实施过程中能够不断调整学习方案与方式,以接近自我提升的效率最大化。 从以下几个大的方面来得到提升&…...
阿里工作7年,一个30岁女软件测试工程师的心路历程
简单的先说一下,坐标杭州,14届本科毕业,算上年前在阿里巴巴的面试,一共有面试了有6家公司(因为不想请假,因此只是每个晚上去其他公司面试,所以面试的公司比较少) 其中成功的有4家&am…...
学生党必备的 Keychron 无线机械键盘
学生党必备的 Keychron 无线机械键盘 由于专业需要,之间的键盘使用起来不太舒服,于是准备重新买一个适合工作学习的键盘,于是通过朋友介绍了解到了keychron k3pro,当时也看到网上一些资料说道这款键盘比较到位,今天就来带大家了解…...
FPGA MAX 10 10M50系列10M50DAF484C8G/10M50DAF484C7G/10M50DCF484C7G规格
介绍MAX 10器件是单芯片、非易失性低成本可编程逻辑器件(pld),用于集成最优的系统组件集。MAX 10设备的亮点包括:内部存储双配置闪存用户闪存即时支持集成模数转换器(adc)支持Nios II单芯片软核处理器MAX 10设备是系统管理、I/O扩展、通信控制平面、工业、汽车和消费…...
【codequ】Java学习路线整理(韩顺平)
文章目录Java学习路线一、Java基础1.建立编程思想Java概述变量运算符控制结构数据、排序和查找面向对象编程(基础)面向对象编程(中级)项目&学以致用2.提升编程能力3.分析需求,代码实现能力Java8新特性二、Java高级…...
政府制作网站收费/八百客crm系统登录入口
往期热门文章:1、牛客网:为什么不能将实数作为 HashMap 的 key? 2、RedisJson发布官方性能报告,性能碾压ES和Mongo 3、分布式数据一致性思考-B端系统一致性 4、Java字符串拼接的五种方法,哪种性能最好? 5、…...
axure rp怎么做网站/注册网站流程和费用
概述:本章介绍磁盘分区和文件系统,深度了解linux存储数据所依赖到各个部分模块。设备文件I/O Ports: I/O设备地址一切皆文件:Linux为所有的设备文件都提供了统一的操作函数接口,方法是使用数据结构struct file_operations。这个数…...
网上接单干活的平台/北京度seo排名
领域驱动模型设计与微服务架构落地-从项目去剖析领域驱动领域驱动模型设计与微服务架构落地-从项目去剖析领域驱动事件风暴(Event Storiming)事件风暴目的什么是事件风暴事件风暴的优点事件风暴应用场景事件风暴准备场地设置海报纸邀请正确的人来参与事件…...
陕西做网站的公司地址/企业文化的重要性
关于C模板的链接错误问题 前几天写了一个模版,按以前的习惯,把定义写在头文件中, 把实现写在cpp文件中。结果在编译的时候没有发生错误,但在连接的时候出现了找不到xxx的错误。一时之间不知道该怎么办才好,后来上网一…...
免费免费网站模板下载/北京疫情最新情况
中断服务表指针ISTP(Interrupt Service Table Pointer)寄存器用于定位中断服务程序的位置,即ISTP指明中断发生后去哪里找要执行的程序,ISTP(其中的ISTB字段)就是指向IST表的寄存器。ISTP中的一个字段ISTB确定IST的地址基数部分&am…...
手机网站建设设计公司/快速提升排名seo
代码已经整理好,效果如下图:(支持Verical Horizontal 支持自定义放大位置 支持滚动速度) 图片1: 图片2: 地址: https://github.com/geeklx/MyApplication/tree/master/p010_recycleviewall/s…...