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

news2025/1/15 5:57:18

一.询问学号(顺序表)

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

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

全文终

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 基于微信小程序的高校科研团队管理系统设计与实现(附源码,部署,文档

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

C#,任意阶幻方(Magic Square)的算法与源代码

1 什么是幻方&#xff1f; 幻方&#xff08;Magic Square&#xff09;是一种将数字安排在正方形格子中&#xff0c;使每行、列和对角线上的数字和都相等的方法。 幻方也是一种中国传统游戏。旧时在官府、学堂多见。它是将从一到若干个数的自然数排成纵横各为若干个数的正方形&…

java求职学习day12

1 泛型机制&#xff08;熟悉&#xff09; 1.1 基本概念 &#xff08;1&#xff09;通常情况下集合中可以存放不同类型的元素&#xff0c;是因为将所有对象都看作Object类型放入&#xff0c;因此从集合中取出元素时&#xff0c;也是Object类型&#xff0c;为了表达该元素真实的…

uni-app h5修改浏览器导航栏的 title以及icon

1.title 在pages.json文件中修改:"navigationBarTitleText":"uni-app" 2.icon的修改 2.1 在static中新建一个index.html文件作为模板文件&#xff0c;并且将你的icon图片也放在static文件夹下 2.2 在index.html文件中加入如下代码&#xff08;记得icon文件…

Mac——Docker desktop安装与使用教程

摘要 本文是一篇关于Mac系统下Docker Desktop安装与使用教程的博文。首先介绍连接WiFi网络&#xff0c;然后详细阐述了如何在Mac上安装Docker&#xff0c;包括下载地址以及不同芯片版本的选择。接着讲解了如何下载基础镜像和指定版本镜像&#xff0c;旨在帮助用户在Mac上高效使…

OJ题目下篇

我们今天继续来看链表的算法题目 我们先来看第一道题&#xff1a; 这是一道牛客网的题目&#xff1a; 链表的回文结构_牛客题霸_牛客网 我们来看这道题&#xff1a;首先我们要判断是不是回文结构&#xff0c;我们之前判断过数组的回文&#xff0c;这是比较好判断的&#xff…

25/1/14 算法笔记<强化学习> CBR加强化学习

CBR,基于案例的推理&#xff0c;它是一种基于过去的实际经验或经历的推理&#xff0c;他可以根据过往的案例找到与当前案例最相关的案例&#xff0c;然后对该案例做改动来解决当前的问题。 CBR的过程 CBR可以看作一个循环过程&#xff1a;相似按键检索-->案例重用-->案…

初识JAVA-面向对象的三大特征之多态

1. 重温面向对象 面向对象是一种解决问题的思想&#xff0c;它把计算机程序看作是各种对象组合起来的。每个对象都有自己的数据&#xff08;属性&#xff09;和行为&#xff08;方法&#xff09;&#xff0c;主要依靠对象之间的交互来解决和实现问题。Java是一门纯面向对象的语…

Pytorch基础教程:从零实现手写数字分类

1.Pytorch简介 ‌PyTorch是一个开源的深度学习框架&#xff0c;由Facebook的人工智能研究院&#xff08;FAIR&#xff09;开发&#xff0c;并于2017年1月正式推出。‌ PyTorch以其灵活性和易用性著称&#xff0c;特别适合于深度学习模型的构建和训练。它基于Torch张量库开发&a…

高性能现代PHP全栈框架 Spiral

概述 Spiral Framework 诞生于现实世界的软件开发项目是一个现代 PHP 框架&#xff0c;旨在为更快、更清洁、更卓越的软件开发提供动力。 特性 高性能 由于其设计以及复杂精密的应用服务器&#xff0c;Spiral Framework框架在不影响代码质量以及与常用库的兼容性的情况下&a…

运维高级课作业三

源码编译安装httpd 2.4 首先下载好httpd-2.4.62.tar.bz2的安装包 将这个文件传入Linux中 将他解归档解入/usr/src/ rpm -e httpd --nodeps # 如果系统自带httpd这个软件要删除掉&#xff0c;两个软件不能同时运行 yum -y install apr apr-devel cyrus-sasl-devel expat-dev…

.Net8 Avalonia跨平台UI框架——<vlc:VideoView>控件播放海康监控、摄像机视频(Windows / Linux)

一、UI效果 二、新建用户控件&#xff1a;VideoViewControl.axaml 需引用&#xff1a;VideoLAN.LibVLC.Windows包 Linux平台需安装&#xff1a;VLC 和 LibVLC &#xff08;sudo apt-get update、sudo apt-get install vlc libvlccore-dev libvlc-dev&#xff09; .axaml 代码 注…

【HM-React】08. Layout模块

基本结构和样式reset 结构创建 实现步骤 打开 antd/Layout 布局组件文档&#xff0c;找到示例&#xff1a;顶部-侧边布局-通栏拷贝示例代码到我们的 Layout 页面中分析并调整页面布局 代码实现 pages/Layout/index.js import { Layout, Menu, Popconfirm } from antd impor…

Canvas简历编辑器-选中绘制与拖拽多选交互方案

Canvas简历编辑器-选中绘制与拖拽多选交互方案 在之前我们聊了聊如何基于Canvas与基本事件组合实现了轻量级DOM&#xff0c;并且在此基础上实现了如何进行管理事件以及多层级渲染的能力设计。那么此时我们就依然在轻量级DOM的基础上&#xff0c;关注于实现选中绘制与拖拽多选交…

C# OpenCV机器视觉:转速测量

在一个看似平常却又暗藏神秘能量的日子里&#xff0c;阿杰正在他那充满科技感的实验室里&#xff0c;对着一堆奇奇怪怪的仪器发呆。突然&#xff0c;手机铃声如一道凌厉的剑气划破寂静&#xff0c;原来是工厂的赵厂长打来的紧急电话&#xff1a;“阿杰啊&#xff0c;咱们工厂新…

vue2制作长方形容器,正方形网格散点图,并且等比缩放拖动

需求&#xff1a;有个长方形的容器&#xff0c;但是需要正方形的网格线&#xff0c;网格线是等比缩放的并且可以无线拖动的&#xff0c;并且添加自适应缩放和动态切换&#xff0c;工具是plotly.js,已完成功能如下 1.正方形网格 2.散点分组 3.自定义悬浮框的数据 4.根据窗口大小…

0基础跟德姆(dom)一起学AI 自然语言处理13-注意力机制介绍2

1 注意力机制规则 它需要三个指定的输入Q(query), K(key), V(value), 然后通过计算公式得到注意力的结果, 这个结果代表query在key和value作用下的注意力表示. 当输入的QKV时, 称作自注意力计算规则&#xff1b;当Q、K、V不相等时称为一般注意力计算规则 例子&#xff1a;seq2…

慧集通(DataLinkX)iPaaS集成平台-系统管理之UI库管理、流程模板

UI库管理 UI库管理分为平台级和自建两种&#xff0c;其中平台级就是慧集通平台自己内置的一些ui库所有客户均可调用&#xff0c;自建则是平台支持使用者自己根据规则自己新增对应的UI库。具体界面如下&#xff1a; 自建UI库新增界面&#xff1a; 注&#xff1a;平台级UI库不支…

通过一个算法的设计来了解栈的一些应用

目录 1.前言 2.步骤 3.代码实现 4.测试 5.运行结果 6.一些思考 7.一些应用示例 1.前言 掌握堆栈的基本原理 掌握堆栈的存储结构 掌握堆栈的进栈、出栈&#xff1b; 判断栈空的实现方法 掌握应用堆栈实现括号匹配的原理和实现方法&#xff1b; 熟悉python语言编程 熟练…

USB 驱动开发 --- Gadget 驱动框架梳理(一)

本文由 Linux 内核文档翻译与总结而来&#xff0c;个人学习笔记仅供参考。 Gadget 框架 在 USB 协议交互过程中&#xff0c;角色定义&#xff1a; the device driver is the master (or “client driver”) Linux 内核中称为 HCD(Host Controller Driver)&#xff0c;负责与 …