蓝桥杯备赛:顺序表和单链表相关算法题详解(上)

目录

一.询问学号(顺序表)

1.题目来源:

2.解析与代码实现:

(1)解析:

(2)代码实现:

二.寄包柜(顺序表)

1.题目来源:

2.解析与代码实现:

(1)解析:

(2)具体代码:

三.快慢指针(单链表)

1.反转链表:

主要思路:三指针法

2.回文结构:

主要思路:快慢指针和三指针反转

四.交叉链表

1.题目:

2.解析与代码实现:


一.询问学号(顺序表)

1.题目来源:

https://www.luogu.com.cn/problem/P3156

(洛谷原题)

2.解析与代码实现:

(1)解析:

首先结合题目和输出样例不难看出这道题目是围绕两个变量:学生个数n和询问次数m,分别代表着第二行和第三行输入数据的个数,因此n和m就非常容易地可以作为接下来我们实现代码里的范围参数,因为当我们在一串数字(这里也就是顺序表)里查找某一个给定的数字就免不了要去遍历这传数字(顺序表)因此就需要这串数字的数字个数来作为遍历循环的范围条件乃至于通过对其减少以便将其作为判断循环是否结束的条件,所以这题的代码思路就很容易可以得到了:首先确定需要我们输入的变量有三行:第一行的n和m,第二行的n个数字,第三行的m个数字,因此就会产生两个循环,然后就是在这两个循环里分别实现数组的输入和指定数组成员的输出就行了

(2)代码实现:
#include<iostream>
#include<vector>using namespace std;const int N = 2e6 ;//定义一下学生的最大个数int n, m;//定义全局变量m,n
vector<int>a(N);//创建一个变长数组aint main()
{//初始化数组(即使用户输入题目里第二行的数组成员)cin >> n >> m;for (int q = 0; q < n; q++){cin >> a[q];}//根据用户输入的序号(第三行)查找上面的数组的特定元素while (m--){int p;cin >> p;cout << a[p] << endl;}return 0;
}

二.寄包柜(顺序表)

1.题目来源:

https://www.luogu.com.cn/problem/P3613

(洛谷原题)

2.解析与代码实现:

(1)解析:

这题粗略浏览下来会感觉有些麻烦,但多读几遍其实也不是非常难以理解,简单来说,这题有以下几个参数:寄包柜个数n,询问次数q,第i个柜子,第j个格子以及存入操作(1),查看操作(2),代码大概实现思路就是通过变长数组(vector)进行存入操作,然后再对用户的输入来判断查找还是存入,最后通过数组访问读取即可,并且存入时再多关注一下空间是否充裕,不够的话用resize扩容即可

(2)具体代码:
#include<iostream>
#include<vector>
using namespace std;const int N = 1e5 + 10;//单纯为了防止空间不够而多加了10个空间vector<int>abc[N];//创建N个柜子int n, q;//创建全局变量
int main()
{cin >> n >> q;while(q--){int option, i, j, k;cin >> option >> i >> j;//存入if (option == 1){cin >> k;//判断空间是否充足if (abc[i].size() <= j){//扩容abc[i].resize(j + 1);}abc[i][j] = k;}else{//查询cout << abc[i][j] << endl;}}return 0;
}

代码这里有一点值得关注一下就是为啥一定要使用vector变长数组而不使用一般的二维数组,如果我使用普通的二维数组:abc[N][N],那这里就相当于要开辟N*2个柜子,而这是与题目要求范围相悖的


三.快慢指针(单链表)

1.反转链表:

原题链接:https://leetcode.cn/problems/reverse-linked-list/description/

主要思路:三指针法

通过三个指针的循环往后移动并在移动过程中改变每一个结点指向从而实现在遍历链表后实现所有结点之间指针方向的改变,同时需要注意的就是在循环的最后,n2和n3指针都指向NULL

#include<stdio.h>struct ListNode 
{int val;struct ListNode* next;
};typedef struct ListNode ListNode;struct ListNode* reverseList(struct ListNode* head) 
{if (head == NULL){return head;}ListNode* n1, *n2, *n3;n1 = NULL, n2 = head, n3 = n2->next;while (n2){n2->next = n1;//改变链表结点之间的指针指向n1 = n2;n2 = n3;if (n3){n3 = n3->next;}}//跳出循环说明此时n2(n3也是)为空return n1;
}

2.回文结构:

原题链接:https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa

主要思路:快慢指针和三指针反转

具体思路主要就是先通过快慢指针找到回文结构的中间位置,然后反转链表并将其与原链表进行遍历比较,如果一样就是回文结构,但这道题其实还有个小漏洞,就是因为题目在限制范围后我们其实就可以讲链表里的数据遍历载入一个数组中然后分别再从头尾进行遍历比较,这是一种钻空子的做法,但就此题来说也不是不行

#include<stdio.h>struct ListNode 
{int val;struct ListNode* next;
};typedef struct ListNode ListNode;//找中间结点
ListNode* middleNode(ListNode* head)
{//创建快慢指针ListNode* fast, * slow;head = fast = slow;if (fast && fast->next)//注意两者顺序不可以颠倒{slow = slow->next;fast = fast->next->next;}return slow;
}//反转链表
ListNode* reverseList(ListNode* head)
{if (head == NULL){return NULL;}ListNode* n1, * n2, * n3;n1 = NULL, n2 = head, n3 = n2->next;n2->next = n1;n1 = n2;n2 = n3;if (n3){n3 = n3->next;}return n1;
}
bool checkpa(ListNode* A)
{//1.找中间结点ListNode* mid = middleNode(A);//2.反转中间结点作为另外一个头的链表ListNode* right = reverseList(mid);//3.遍历原链表和反转之后的链表,比较结点的值是否相同ListNode* left = A;//此时反转后的链表指向空,但原链表依旧往后延续,可以参考下图while (right){if (left->val != right->val){return false;}left = left->next;right = right->next;}return true;
}


四.交叉链表

1.题目:

原题来源:https://leetcode.cn/problems/intersection-of-two-linked-lists/description/

2.解析与代码实现:

这题相比上面的思路就要显得更加简洁,浏览题目易得这题的主要着手点就在于两条链表重合前是否长度相等,因此就可以通过先分别计算出两条链表的长度然后使长链表先走掉比短的那条链表多出来的的长度差,然后再依次遍历比较即可

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB)
{//先求两条链表的长度ListNode* pa = headA;ListNode* pb = headB;int sizeA = 0, sizeB = 0;while (pa){++sizeA;pa = pa->next;}while (pb){++sizeB;pb = pb->next;}int gap = abs(sizeA - sizeB);//abs函数求绝对值//让长链表先走gap步ListNode* longlist = headB;ListNode* shortlist = headA;if (sizeA < sizeB){shortlist = headB;longlist = headA;}while (gap--){longlist = longlist->next;}//此时长短链表处于同一起跑线while (shortlist){if (shortlist == longlist){return longlist;}shortlist = shortlist->next;longlist = longlist->next;}return NULL;
}

以上就是我在这篇文章里想写的几道题目的全部了

全文终

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

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

相关文章

uni-app的学习

uni-app 有着跨平台支持、丰富的插件和生态系统、高性能、集成开发工具HBuilderX的配合使用。允许使用者仅通过一套代码发布到多平台使用。 uni-app官网 uni-app 是一个适合开发跨平台移动应用和小程序的框架&#xff0c;能够大幅提高开发效率。 一、了解 1.1 工具准备 从Git…

基于光偏振与光学调制实现白光干涉相移

基于光的偏振特性和一些光学元件对光的调制作用&#xff0c;实现白光干涉中的光学相移原理是一个复杂而精细的过程。以下是对这一原理的详细解释&#xff1a; 一、光的偏振特性 光的偏振是指光波在传播过程中&#xff0c;光矢量的方向和大小有规则变化的现象。圆偏振光的电场…

Flutter:封装ActionSheet 操作菜单

演示效果图 action_sheet_util.dart import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:demo/common/index.dart;class ActionSheetUtil {/// 底部操作表/// [context] 上下文/// [title] 标题/// [items] 选项列表 …

使用yarn命令创建Vue3项目

文章目录 1.技术栈2.创建流程2.1创建vue3项目2.2选择配置项2.3进入项目目录 3.使用Yarn启动项目3.1安装依赖3.2运行项目 1.技术栈 yarnvitevue3 2.创建流程 2.1创建vue3项目 vue create 项目名称2.2选择配置项 直接回车可选择Vue3 2.3进入项目目录 cd 项目名称默认在当前…

【Node.js的安装与配置】

目录&#xff1a; 一&#xff1a;下载Node.js二&#xff1a;安装Node.js三&#xff1a;配置存放目录四&#xff1a;配置环境变量五&#xff1a;配置淘宝镜像六&#xff1a;测试Node.js 一&#xff1a;下载Node.js &#x1f534; 下载地址&#xff1a;https://www.nodejs.com.cn…

【AIGC】SYNCAMMASTER:多视角多像机的视频生成

标题&#xff1a;SYNCAMMASTER: SYNCHRONIZING MULTI-CAMERA VIDEO GENERATION FROM DIVERSE VIEWPOINTS 主页&#xff1a;https://jianhongbai.github.io/SynCamMaster/ 代码&#xff1a;https://github.com/KwaiVGI/SynCamMaster 文章目录 摘要一、引言二、使用步骤2.1 TextT…

左神算法基础提升--1

文章目录 哈希函数哈希函数的主要特点确定性快速计算输出长度固定离散性 哈希表哈希表的原理解题 布隆过滤器布隆过滤器的主要特点高效性快速查询空间效率误报率 布隆过滤器的原理 一致性哈希一致性哈希原理一致性哈希应用 哈希函数 哈希函数是一种将任意长度的输入&#xff0…

【Go】Go Gin框架初识(一)

1. 什么是Gin框架 Gin框架&#xff1a;是一个由 Golang 语言开发的 web 框架&#xff0c;能够极大提高开发 web 应用的效率&#xff01; 1.1 什么是web框架 web框架体系图&#xff08;前后端不分离&#xff09;如下图所示&#xff1a; 从上图中我们可以发现一个Web框架最重要…

VS Code 的扩展下载安装的最新方式

离线包的下载 在 2024年的时候&#xff0c;在VS Code的官方扩展市场&#xff1a;https://marketplace.visualstudio.com/ &#xff0c; 搜索到需要的扩展之后&#xff0c;是可以在对应的页面现在最新版本和几个历史版本的扩展的安装包。 下载下来的扩展包的文件是后缀是 vsix …

【Vue3 入门到实战】3. ref 和 reactive区别和适用场景

目录 ​编辑 1. ref 部分 1.1 ref定义基本数据类型 1.2 ref 定义引用数据类型 2. reactive 函数 3. ref 和 reactive 对比 3.1 原理 3.2 区别 3.3 使用原则 在 Vue 3 中 ref 和 reactive 是用于创建响应式数据的两个核心函数。它们都属于 Composition API 的一部分&…

浅谈云计算07 | 云安全机制

云计算安全机制 一、引言二、加密技术&#xff1a;数据的隐形护盾三、散列机制&#xff1a;数据完整性的忠诚卫士四、数字签名&#xff1a;数据来源与真伪的鉴定专家五、公钥基础设施&#xff08;PKI&#xff09;&#xff1a;信任的基石六、身份与访问管理&#xff08;IAM&…

【Sql递归查询】Mysql、Oracle、SQL Server、PostgreSQL 实现递归查询的区别与案例(详解)

文章目录 Mysql 5.7 递归查询Mysql 8 实现递归查询Oracle递归示例SQL Server 递归查询示例PostgreSQL 递归查询示例 更多相关内容可查看 Mysql 5.7 递归查询 MySQL 5.7 本身不直接支持标准 SQL 中的递归查询语法&#xff08;如 WITH RECURSIVE 这种常见的递归查询方式&#xf…

【Unity3D】【已解决】TextMeshPro无法显示中文的解决方法

TextMeshPro无法显示中文的解决方法 现象解决方法Assets 目录中新建一个字体文件夹在C:\Windows\Fonts 中随便找一个中文字体的字体文件把字体文件拖到第一步创建的文件夹中右键导入的字体&#xff0c;Create---TextMeshPro---Font Asset&#xff0c;创建字体文件资源把 SDF文件…

ShaderJoy —— 如何判别直线是否和二次贝塞尔曲线相交【GLSL】

效果图 关键代码解析 bool IntersectsQuadraticBezier (vec2 src, vec2 dest) {float A = (CONTROL_POINT_A - 2.0 * CONTROL_POINT_B

第十二章:算法与程序设计

文章目录&#xff1a; 一&#xff1a;基本概念 1.算法与程序 1.1 算法 1.2 程序 2.编译预处理 3.面向对象技术 4.程序设计方法 5.SOP标志作业流程 6.工具 6.1 自然语言 6.2 流程图 6.3 N/S图 6.4 伪代码 6.5 计算机语言 二&#xff1a;程序设计 基础 1.常数 …

【BLE】CC2541之ADC

本文最后修改时间&#xff1a;2022年04月12日 23:00 一、本节简介 本文介绍如何通过P05口采集电压值。 二、实验平台 1&#xff09;CC2541平台 ①协议栈版本&#xff1a;BLE-CC254x-1.4.0 ②编译软件&#xff1a;IAR 10.20.1 ③硬件平台&#xff1a;香瓜CC2541开发板、USB…

SpeingMVC框架(三)

目录 五、响应数据与结果视图 1、返回值分类 2、springmvc的请求转发和重定向 六、异常处理 1、处理思路 2、自定义异常处理器 七、springmvc中的拦截器 1、拦截器概述 2、自定义拦截器步骤 五、响应数据与结果视图 1、返回值分类 返回String&#xff1a;Controller方…

Hadoop3.x 万字解析,从入门到剖析源码

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

【Vue】分享一个快速入门的前端框架以及如何搭建

先上效果图: 登录 菜单: 下载地址: 链接&#xff1a;https://pan.baidu.com/s/1m-ZlBARWU6_2n8jZil_RAQ 提取码&#xff1a;ui20 … 主要是可以自定义设置token,更改后端请求地址较为方便。 应用设置: 登录与token设置: 在这里设置不用登录,可以请求的接口: request.js i…

汽车免拆诊断案例 | 2007 款法拉利 599 GTB 车发动机故障灯异常点亮

故障现象  一辆2007款法拉利599 GTB车&#xff0c;搭载6.0 L V12自然吸气发动机&#xff08;图1&#xff09;&#xff0c;累计行驶里程约为6万km。该车因发动机故障灯异常点亮进厂检修。 图1 发动机的布置 故障诊断 接车后试车&#xff0c;发动机怠速轻微抖动&#xff0c;…