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…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
