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

目录

一.询问学号(顺序表)

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);//创建一个变长数组a

int 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;
}

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

全文终

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构-ArrayLIst-一起探索顺序表的底层实现

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 大家好&#xff0c;我们今天来学习java数据结构的第一章ArrayList&#xff08;顺序表&#xff09; 1.ArrayList的概念 那小伙伴就要问了线性表到…

RabbitMQ(四)

SpringBoot整合RabbitMQ SpringBoot整合1、生产者工程①创建module②配置POM③YAML④主启动类⑤测试程序 2、消费者工程①创建module②配置POM③YAML文件内配置&#xff1a; ④主启动类⑤监听器 3、RabbitListener注解属性对比①bindings属性②queues属性 SpringBoot整合 1、生…

初始Java4

目录 一.继承 1.定义&#xff1a; 2.继承的语法&#xff1a; 3.子类访问父类 4.子类构造方法 5.super与this 6.继承方法 7.final关键字 &#xff08;1&#xff09;.变量不变 &#xff08;2&#xff09;.方法不变 &#xff08;3&#xff09;.类不可继承 8.继承与组合…

极限竞速 地平线5“d3dx12_43.dll”文件丢失或错误导致游戏运行异常如何解决?windows系统DLL文件修复方法

d3dx12_43.dll是存放在windows系统中的一个重要dll文件&#xff0c;缺少它可能会造成部分软件不能正常运行。当你的电脑弹出提示“无法找到d3dx12_43.dll”或“计算机缺少d3dx12_43.dll”等错误问题&#xff0c;请不用担心&#xff0c;我们将深入解析DLL文件错误的成因&#xf…

Leecode刷题C语言之超过阈值的最小操作数②

执行结果:通过 执行用时和内存消耗如下&#xff1a; // 最小堆的节点结构体 typedef struct {long long* heap;int size;int capacity; } MinHeap;// 初始化最小堆 MinHeap* createMinHeap(int capacity) {MinHeap* minHeap (MinHeap*)malloc(sizeof(MinHeap));minHeap->s…

[Qt]常用控件介绍-按钮类控件-QPushButton、QRedioButton、QCheckBox、QToolButton控件

目录 1.QPushButton按钮 介绍 属性 Demo&#xff1a;键盘方向键控制人物移动 2.Redio Button按钮 属性 clicked、pressed、released、toggled区别 单选按钮的分组 Demo&#xff1a;点餐小程序 3.CheckBox按钮 属性 Demo&#xff1a;获取今天的形成计划 4.ToolBu…

寒假第一次牛客周赛 Round 76回顾

AC数&#xff1a;2&#xff08;A、C&#xff09; B 思路&#xff1a; 等价于求&#xff1a; 数量最多的字符 #include<stdio.h> int main() {int n,num;int a[26]{0};//用于存储字母 a 到 z 的出现次数。scanf("%d",&n);char s[n];scanf("%s",s)…

StyleGaussian: Instant 3D Style Transferwith Gaussian Splatting 论文解读

目录 一、概述 二、相关工作 1、辐射场 2、3D编辑 3、风格迁移 三、StyleGaussian 1、特征嵌入 2、风格迁移 3、解码 四、实验 1、不同backbone下的量化和定性指标 2、解码器设计上的测试 3、内容损失平衡 4、风格平滑插值 一、概述 提出了StyleGaussian&#x…

基于django实现类似ebay的电子商务系统全英文

完整源码项目包获取→点击文章末尾名片&#xff01;

win32汇编环境,窗口程序中组合框的应用举例

;运行效果 ;win32汇编环境,窗口程序中组合框的应用举例 ;比如在窗口程序中生成组合框&#xff0c;增加子项&#xff0c;删除某项&#xff0c;取得指定项内容等 ;直接抄进RadAsm可编译运行。重点部分加备注。 ;以下是ASM文件 ;>>>>>>>>>>>>…

Docker 镜像制作原理 做一个自己的docker镜像

一.手动制作镜像 启动容器进入容器定制基于容器生成镜像 1.启动容器 启动容器之前我们首先要有一个镜像&#xff0c;这个镜像可以是从docker拉取&#xff0c;例如&#xff1a;现在pull一个ubuntu镜像到本机。 docker pull ubuntu:22.04 我们接下来可以基于这个容器进行容器…

微信小程序获取openid

2025年1月15日&#xff1a; 1、现在云服务器上安装nodejs&#xff0c;然后写个get接口&#xff1a; const express require(express); const app express();app.get(/getOpenid,(req,res)>{res.send("success"); })app.listen(3000,()>{console.log(server…

ASP.NET Core - 配置系统之配置添加

ASP.NET Core - 配置系统之配置添加 2. 配置添加 2. 配置添加 配置系统可以读取到配置文件中的信息&#xff0c;那必然有某个地方可以将配置文件添加到配置系统中。之前的文章中讲到 ASP.NET Core 入口文件中&#xff0c;builder(WebApplicationBuilder 对象) 中有一个 Config…

C#中通道(Channels)的应用之(生产者-消费者模式)

一.生产者-消费者模式概述 生产者-消费者模式是一种经典的设计模式&#xff0c;它将数据的生成&#xff08;生产者&#xff09;和处理&#xff08;消费者&#xff09;分离到不同的模块或线程中。这种模式的核心在于一个共享的缓冲区&#xff0c;生产者将数据放入缓冲区&#x…

ArcSegment绘制及计算

ArcSegment绘制及计算 给定起始点、终止点和 bulge 值计算弧线中心点和半径&#xff0c;绘制ArcSegment。 import math def calculate_arc_center_and_radius(x1, y1, x2, y2, bulge):angle4*math.atan(bulge)# 计算弦中点mid_x (x1 x2) / 2mid_y (y1 y2) / 2# 计算弦长的…

【高可用自动化体系】自动化体系

架构设计的愿景就是高可用、高性能、高扩展、高效率。为了实现架构设计四高愿景&#xff0c;需要实现自动化系统目标&#xff1a; 标准化。 流程自助化。 可视化&#xff1a;可观测系统各项指标、包括全链路跟踪。 自动化&#xff1a;ci/cd 自动化部署。 精细化&#xff1a…

FakeLocation 1599 | 内部旧版

前言:FakeLocation又更新了,在某安上面看见一些&#xff0c;大概问题就是地图没了&#xff0c;然后有更难搞了 任务一 我们先去看看地图是怎么个事情 这里用的是百度地图就没有了哈 高德地图是有的 任务二 null 选择成功了&#xff0c;虽然是null 任务三 地图位置 虽然不显示了…

初识算法和数据结构P1:保姆级图文详解

文章目录 前言1、算法例子1.1、查字典&#xff08;二分查找算法&#xff09;1.2、整理扑克&#xff08;插入排序算法&#xff09;1.3、货币找零&#xff08;贪心算法&#xff09; 2、算法与数据结构2.1、算法定义2.2、数据结构定义2.3、数据结构与算法的关系2.4、独立于编程语言…

2025年华数杯国际赛B题论文首发+代码开源 数据分享+代码运行教学

176项指标数据库 任意组合 千种组合方式 14页纯图 无水印可视化 63页无附录正文 3万字 1、为了方便大家阅读&#xff0c;全文使用中文进行描述&#xff0c;最终版本需自行翻译为英文。 2、文中图形、结论文字描述均为ai写作&#xff0c;可自行将自己的结果发给ai&#xff0c…

CSS的小知识

一、子选择器 (>) 让 CSS 样式只作用于子级和孙级元素&#xff0c;而不影响其他元素 有>是只对其子级有效&#xff0c;子选择器只会影响直接的子级元素&#xff0c;而不会影响更深层次的孙级元素 无>时是对子级、孙级、曾孙级等所有后代都有效