自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(106)
  • 收藏
  • 关注

原创 蓝桥杯备赛:Day8-小苯的异或和

题目要求计算数组中所有两两元素异或结果的总异或和。关键思路是利用异或性质和贡献法:每个元素出现(n-1)次,若(n-1)为偶数则抵消为0,否则保留所有元素的异或总和。该方法将O(n²)暴力计算优化为O(n)时间,利用异或的自反性(x^x=0)和组合数学的计数原理。核心代码预先计算总异或,再根据(n-1)的奇偶性输出0或总异或值,避免了超时问题。

2026-04-07 23:59:29 421

原创 蓝桥杯备赛:Day8-小红杀怪

这篇文章介绍了小红杀怪问题的算法思路与C++实现。题目要求用最少技能次数击杀两只怪物,玩家可选择单体攻击或群体攻击。核心解法是枚举群体攻击次数k(0-20次),计算剩余血量所需的单体攻击次数,从而找到总次数的最小值。文章提供了完整的代码实现,重点解释了枚举策略的选择、向上取整公式的应用以及边界处理等关键点。该解法利用了题目中参数范围小的特点,通过枚举简化了搜索空间,确保在合理时间内找到最优解。

2026-04-07 23:58:05 685

原创 蓝桥杯备赛:Day7- P10424 [蓝桥杯 2024 省 B] 好数

本文介绍了蓝桥杯2024省赛B题"好数"的解题方法。题目要求统计1到N中满足奇数位数字为奇数、偶数位数字为偶数的数字个数。通过C++实现的核心算法,从低位到高位逐位检查,利用取模和整除运算进行数字拆分,并采用剪枝优化(仅检查个位为奇数的数字)提高效率。关键点包括正确的进制拆分顺序、复杂度控制和位权处理,同时指出了常见的编码陷阱,如忘记降位操作和变量更新遗漏。该解法时间复杂度为O(N),适用于N≤10^7的数据规模。

2026-04-06 23:38:55 602

原创 蓝桥杯备赛:Day7- U535982 C-小梦的AB交换

题目要求将长度为2n的AB串通过最少交换操作变为交替排列。核心思路是比对两种目标模式(ABAB...和BABA...),统计差异点个数。由于每次交换可同时修正两个差异位,最终答案为两种模式差异点数的较小值除以2。解题时需注意变量初始化、字符引号使用、循环范围等细节。代码通过遍历字符串计算差异点数,取最小值输出交换次数。

2026-04-06 23:37:30 433

原创 蓝桥杯备赛:Day6-B-小紫的劣势博弈 (牛客周赛 Round 85)

【代码】蓝桥杯备赛:Day6-B-小紫的劣势博弈 (牛客周赛 Round 85)

2026-04-06 00:12:37 423

原创 蓝桥杯备赛:Day5-P1706 全排列问题

本文解析了全排列问题的DFS解法,通过递归实现1~N数字的所有排列组合。核心代码展示了如何利用DFS深度优先搜索填充位置数组,并强调回溯机制的关键作用:在完成一种排列后释放数字,确保参与其他排列分支。文章详细拆解了递归过程,特别是第二层工人的工作流程,说明状态维护和回溯操作。最后总结了常见错误,如return位置错误和忽略回溯导致的排列缺失。该解法时间复杂度为O(N!),严格遵循字典序和5位场宽格式要求。

2026-04-05 00:23:16 363

原创 蓝桥杯备赛:Day5-P1036 选数

本文介绍了洛谷P1036选数问题的解题思路,重点分析了组合搜索和质数判定的实现方法。通过DFS组合模型,利用start参数确保选取下标的单调性,避免重复排列。采用隐式回溯技巧传递sum参数,无需手动撤销操作。质数判定使用i*i<=n的标准优化方法,时间复杂度为O(√N)。该解法适用于n≤20的数据规模,能高效统计k个数字和为质数的组合数。

2026-04-05 00:22:26 503

原创 蓝桥杯备赛:Day4-P9749 公路

本文介绍了洛谷P9749公路问题的贪心算法解法。题目要求计算开车经过N个站点时的最小油费开销,每个站点油价不同,油箱容量无限。核心思路是维护历史最低油价和剩余路程额度:每当到达新站点时更新最低油价;若剩余油量不足,按历史最低价补足所需油量并计算余量。关键点包括:1)单调贪心思想,只需比较当前和历史最低油价;2)使用向上取整技巧计算需购买油量;3)正确处理余量以避免误差。注意事项:必须使用long long防止溢出,数组要多开空间。作者还分享了将min_price初始化为0的错误教训,强调应设为第一站油价或极

2026-04-04 00:47:14 506

原创 蓝桥杯备赛:Day4-P10387 训练士兵

摘要: 题目P10387要求以最小成本训练士兵达标。每个士兵有单练费用$p_i$和需求次数$c_i$,可选择团购(每次$S$元训练所有未达标士兵)。贪心策略:按$c_i$升序排序,动态维护未达标士兵的单练总价total_p,每轮选择$\min(total_p, S)$作为当前训练成本。当士兵达标时,从total_p中剔除其费用。时间复杂度$O(N\log N)$,需注意数据范围(用long long)和排序方向(升序才能正确模拟时间线)。易错点包括排序逻辑错误和数组越界访问。

2026-04-04 00:46:25 783

原创 蓝桥杯备赛:Day3-P1102 A-B 数对

本文介绍了P1102 A-B数对问题的解法。题目要求在给定数列中找到满足A-B=C的数对数量。核心思路是将问题转化为A=B+C,通过哈希表统计数字出现次数,实现O(N log N)的高效查找。关键点包括:公式变形优化、哈希表计数处理、注意数据类型防止溢出。文章还指出了常见错误,如输出位置不当和逻辑顺序错误,强调应先完整读入数据再处理。该解法适用于大规模数据,避免了暴力枚举的超时问题。

2026-04-03 00:26:25 652

原创 蓝桥杯备赛:Day3-P1918 保龄球

本文介绍了使用STL map解决保龄球位置查询问题的方法。题目要求在N堆保龄球中快速查询指定球数对应的位置编号。核心思路是建立从球数到位置的映射,利用map的O(logN)查找特性高效处理查询。关键点包括:反向索引映射、I/O优化使用"\n"替代endl、注意long long类型防止溢出。常见错误包括映射方向错误、输入作用域不当等。该解法时间复杂度为O((N+Q)logN),适用于10^5级别的数据规模。

2026-04-03 00:24:11 499

原创 蓝桥杯备赛:Day2-P5266 学籍管理

本文介绍了如何使用C++ STL中的map容器实现学籍管理系统。系统支持添加/更新、查询、删除学生信息和统计人数4种操作,核心是利用map的O(logN)时间复杂度特性。重点讲解了map的基本操作(插入/更新、删除、查找和容量统计)及注意事项,特别强调应使用count()而非[]操作符进行存在性判断以避免静默插入。文中还分享了作者在开发过程中遇到的静态变量初始化和switch作用域等易错点,并提供了完整的代码实现,适合需要处理大量数据的场景。

2026-04-02 00:39:11 355

原创 蓝桥杯备赛:Day2-B3612 求区间和

本文介绍了使用前缀和算法高效求解区间和问题。通过预处理构建前缀和数组Sum,可以在O(1)时间内完成每次区间查询。关键点包括:1)前缀和递推公式Sum[i]=a[i]+Sum[i-1];2)区间和公式Sum[r]-Sum[l-1];3)注意数组下标从1开始。文章还总结了常见错误,如公式记忆偏差和动态数组定义错误,并强调使用long long防止溢出。该算法将时间复杂度从O(MN)优化至O(N+M),适用于大规模数据查询。

2026-04-02 00:38:12 442

原创 蓝桥杯备赛:Day1-P1101 单词方阵

单词可以沿 8 个方向(上、下、左、右、左上、右上、左下、右下)直线延伸。的字母方阵中找出所有的。

2026-04-01 01:00:29 306

原创 蓝桥杯备赛:Day1-奖学金

comp。

2026-04-01 00:57:06 294

原创 Linux系统编程--线程概念与控制

本文从操作系统角度重新定义了进程和线程的概念:进程是系统资源分配的基本实体,而线程是CPU调度的基本单位。Linux通过独特的轻量级进程(LWP)模型实现线程,多个task_struct共享同一地址空间来模拟多线程。与传统操作系统不同,Linux内核不区分进程和线程,统一使用task_struct进行管理调度。文章还通过"家庭模型"类比,形象说明进程如同资源分配的家庭单位,线程则是共享资源的家庭成员。这种设计使Linux线程实现更高效,完全复用进程管理机制,无需额外线程调度逻辑。

2025-09-25 00:24:41 893

原创 Linux系统编程--进程信号

本文介绍了Linux进程信号的概念与应用。首先通过生活实例类比信号机制,如闹钟、交通灯等,解释信号的核心特性是中断当前任务处理紧急事件。然后通过代码示例展示如何捕捉和处理信号(如Ctrl+C对应的2号信号),并详细阐述了前台与后台进程的区别及管理方法。重点讲解了进程的同步与异步处理机制,说明信号是一种异步通知方式,能够在不阻塞主进程的情况下处理外部事件。文章还介绍了任务控制命令(jobs、fg、bg)和终止后台进程的方法,帮助读者深入理解信号在系统进程管理中的作用。

2025-09-21 11:23:09 945

原创 Linux系统编程--进程间通信

本文介绍了进程间通信(IPC)的概念和实现原理。首先阐述了进程独立性与协作需求之间的矛盾:进程需要独立性保证稳定性,但实际应用中又需要协作完成复杂任务。然后说明了IPC的三个主要目的:数据传输、资源共享和通知控制。文章重点分析了管道这一经典IPC机制,包括其基于文件系统的设计思想,以及匿名管道通过fork()继承文件描述符表和pipe()系统调用实现进程间通信的具体原理。最后强调了标准规范对跨平台IPC实现的重要性,如System V IPC、POSIX标准等。全文围绕"让不同进程看到同一份资源&

2025-09-09 21:38:05 593

原创 Linux系统编程--库的制作与原理

本文介绍了库的概念、分类及制作原理。库是预先编写好的可复用代码,分为静态库(.a/.lib)和动态库(.so/.dll)。重点讲解了静态库的制作流程:首先将源文件编译为目标文件(.o),然后使用ar命令打包成静态库(.a)。使用时通过gcc的-I、-L、-l选项指定头文件路径、库文件路径和库名。最后说明了如何将自定义库安装到系统标准路径,以及用Makefile实现自动化构建。静态库通过直接链接到可执行文件中实现代码复用。

2025-09-05 19:54:47 827

原创 Linux系统编程--Ext系列文件系统

摘要:本文介绍了Ext系列文件系统的概念及其与磁盘结构的关系。首先阐述了文件系统的基本功能——管理未打开文件,随后详细解析了磁盘的物理结构(盘片、磁头、传动臂等)和存储结构(磁道、扇区、柱面)。重点描述了CHS寻址方式和磁盘逻辑结构,将磁盘抽象为三维数组,进而转换为LBA地址。通过对比磁带结构,说明了磁盘数据的线性读取逻辑,并举例说明了LBA地址与CHS定位的转换过程。文章从硬件层到操作系统层,系统性地讲解了磁盘管理的基础原理。

2025-09-04 09:00:00 1134

原创 Linux系统编程--基础IO

文章摘要:本文系统介绍了基础IO操作,重点围绕文件概念展开。首先从狭义和广义层面定义了文件,指出文件本质是内容加属性,并强调所有文件操作都需通过操作系统进行。文章回顾了C语言文件操作接口,如fopen、fwrite等,并通过示例代码演示了读写操作。特别说明程序启动时默认打开stdin、stdout、stderr三个标准流的原因及作用。最后详细解析了C语言中不同文件打开方式的区别,包括r、r+、w、w+、a等模式的功能特点,为理解文件IO操作提供了全面基础。

2025-09-03 10:36:30 649

原创 Linux系统编程--进程控制

本文主要介绍了Linux进程控制的关键技术,包括进程创建、终止和写时拷贝机制。文章首先详细解析了fork函数的工作原理,阐述了内核如何通过复制父进程数据结构并采用写时拷贝技术来高效创建子进程。接着分析了进程退出的三种场景及其意义,并解释了进程终止的本质是释放系统资源。重点剖析了写时拷贝的实现机制及其两大优势:降低进程创建成本、节省物理内存。最后简要提及了fork的常规用法和调用失败的常见原因。这些内容为理解Linux进程管理机制提供了重要基础。

2025-08-30 10:33:13 943

原创 Linux系统编程--进程概念(全文六万五千字精讲!!)

本文介绍了进程的基本概念和基本操作。进程是程序的一个执行实例,从内核角度看是分配系统资源的实体。Linux系统中使用task_struct结构体描述进程信息,并通过双向链表组织管理。操作方面,介绍了查看进程的多种方法(ps命令、/proc目录查看),以及结束进程的两种方式(Ctrl+C、kill命令)。最后说明了通过系统调用getpid()和getppid()获取进程标识符的方法,并附有示例代码演示如何获取并打印进程ID和父进程ID。进程管理本质上是操作系统通过先描述后组织的方式对进程信息进行管理。

2025-08-23 21:11:13 1274 1

原创 树莓派5终极指南:从零开始配置国内源与OpenCV开发环境

本文详细介绍了树莓派5在国内环境的配置指南,主要包括两个核心内容:1)更换国内镜像源(推荐清华大学镜像源)以解决软件安装缓慢问题,包括备份原文件、修改apt和pip配置的完整步骤;2)配置OpenCV开发环境,重点解决依赖包安装问题,并推荐使用Python虚拟环境进行开发。文章针对配置过程中可能遇到的"libjasper-dev缺失"等常见错误提供了解决方案,帮助用户快速搭建高效的开发环境。

2025-08-20 11:57:37 1925

原创 Linux系统编程--计算机的体系结构

本文主要介绍了计算机体系结构中的冯诺依曼体系和操作系统的基本概念。冯诺依曼体系由输入设备、输出设备、运算器、存储器和控制器五部分组成,CPU通过内存间接访问外设,所有程序必须加载到内存才能运行。操作系统作为管理软硬件资源的软件,通过系统调用接口为用户提供服务,其管理方法是对被管理对象先描述再组织,本质是对数据的管理。文章还通过层状结构展示了软硬件之间的访问关系,解释了操作系统设计的核心目的和功能,包括进程管理、文件系统、内存管理和驱动管理等模块。

2025-08-09 22:51:43 912

原创 Linux系统编程--基础开发工具

本文介绍了Linux基础开发工具中的软件包管理器及其生态。主要内容包括:1)Linux下三种软件安装方式(源码编译、rpm安装、yum安装),重点说明yum作为常用包管理器的优势;2)Linux软件生态的构成要素(社区、文档、软件体系等)及其良性循环机制;3)国内外软件源镜像站的介绍,包括阿里云、清华等国内镜像源;4)软件包依赖问题的解决方案。文章还详细讲解了yum的具体操作命令,如查看软件包列表等。通过类比手机应用商店,帮助理解Linux软件包管理机制。

2025-08-07 22:32:31 502

原创 Linux系统编程--权限管理

本文介绍了Linux系统的权限管理机制,主要内容包括: Shell命令运行原理:Shell作为命令行解释器,负责将用户指令传递给内核执行,并返回结果。它通过创建子进程执行命令,避免自身崩溃。 Linux用户分类与切换:系统分为超级用户(root)和普通用户,可通过su命令切换,支持sudo临时提权机制。 文件权限管理: 文件访问者分为所有者(u)、所属组(g)和其他用户(o) 文件属性包含类型标识(d目录、-普通文件等)和权限(rwx) 权限由三组rwx组成,分别对应所有者、组和其他用户的读写执行权限 特殊

2025-08-07 22:05:02 1231

原创 C++11

C++11 引入了重要的新特性,包括统一的列表初始化和 initializer_list 容器。列表初始化允许使用 {} 对任意对象进行初始化,支持内置类型和自定义类型,编译器会自动优化构造过程。initializer_list 类封装了常量区数据,使 STL 容器能够通过列表初始化构造对象。这些改进使 C++ 更加现代化,简化了容器的初始化操作,提升了代码简洁性和性能。C++11 作为重大更新版本,为后续 C++14/17/20 的发展奠定了基础。

2025-07-20 22:09:40 975

原创 C++--哈希表封装实现 unordered_map 和 unordered_set

本文介绍了哈希表封装实现 unordered_map 和 unordered_set 的方法。主要内容包括: 分析了SGI-STL30版本中哈希表的实现框架,hash_map和hash_set通过复用同一个hashtable实现key和key/value结构。 模拟实现了unordered_map和unordered_set的底层哈希表框架: 使用模板参数T控制哈希节点数据类型 通过仿函数MapKeyOfT/SetKeyOfT获取键值 解决string类型取模问题,特化HashFunc仿函数 关键点: 哈希

2025-07-16 12:02:12 1152

原创 C++--哈希

哈希是一种通过哈希函数建立关键字与存储位置映射关系的数据组织方式,可实现快速查找。关键概念包括负载因子(衡量空间利用率与冲突概率)、哈希函数设计原则(如直接定址法、除留余数法等)以及哈希冲突解决方法(闭散列的线性/二次探测和开散列的链地址法)。闭散列通过探测空位解决冲突,而开散列通过链表链接冲突元素。文中还探讨了不同哈希函数的适用场景及其优缺点,强调设计高效哈希函数以减少冲突的重要性。

2025-07-15 19:15:35 392

原创 C++--unordered_set和unordered_map的使用

Key 就是 unordered_set 底层关键字的类型。unordered_set 默认要求 Key 支持转换为整形,如果不支持或者想按自己的需求实现可以将 Key 转成整形的哈希函数传给第二个模板参数。unordered_set 默认要求 Key 支持比较相等,如果不支持或者想按自己的需求实现可以将 Key 比较相等的函数传给第三个模板参数。unordered_set 底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第四个参数。

2025-07-13 22:57:09 859

原创 C++--红黑树封装实现set和map

为了让 end() 能够指向最右节点的下一个节点, stl 源码中增加了一个哨兵位的头结点,该节点的 left 指向这棵树的最左节点,也就是 begin(),right 指向这棵树的最右节点,parent 指向 nullptr,然后让根的父节点指向它,最右节点的 right 也指向它,所以在 stl 源码的实现中这个哨兵位头结点就是 end()。如图:it指向11,11右为空,11是8的右,11所在子树访问完了,8所在子树也访问完了,继续往上找,8是13的左,那么下一个访问的结点就是13。

2025-07-13 20:41:23 825 1

原创 牛客 OR36.链表的回文结构

题目描述:对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。创建新的数组,遍历原链表,将链表节点中的值放入数组,在数组中判断是否为回文结构。,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。给定一个链表的头指针。

2025-07-11 15:40:05 414

原创 C++--红黑树

红黑树是一种平衡二叉搜索树,但和 AVL 树使用高度来控制平衡不同,红黑树在每个结点上增加一个存储位来表示结点的颜色,可以是Red或Black,然后通过对任何一条从根到叶子的路径上各个结点着色方式的限制来达到接近平衡。红黑树通过对每个节点颜色的限制,从而使得整棵树的最长路径不超过最短路径的两倍 (注意是整棵树,对子树没有要求),这样红黑树就可以达到接近平衡。注意:因为红黑树只要求整棵树中最长路径是最短路径的两倍,所以红黑树是近似平衡的,即子树中某一路径可能比另一条路径长两倍不止;

2025-07-11 15:39:08 1585

原创 牛客 CM11.链表分割

给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。题目描述:现有一链表的头指针 ListNode*

2025-07-10 19:06:30 273

原创 C++--异常

实际上很多公司都会自定义自己的异常体系统进行异常管理。公司中的项目一般会进行模块划分,让不同的程序模块或小程序完成不同的模块,如果不对抛出异常事件进行规划,那么负责模块层抛出异常的程序员将无法知道因为需要抛出各类型的异常。因此实际公司定义了一套集中的规范体系,首先定义一个最基础的异常类,所有人抛出的异常都必须继承该类异常的最低类型,因为异常处理可以仅基类异常抛出的最低类型异常,因此最基础类的异常类型就抛出了。

2025-07-10 19:05:18 712

原创 LeetCode 21. 合并两个有序链表

以上代码中在插入 l1 和 l2 的时候分链表为空和不为空的代码十分冗余,可以先通过malloc 为链表分配一个哨兵位就可以解决这个问题,最后再将哨兵位给释放掉即可。新链表是通过拼接给定的两个链表的所有节点组成的。题目描述:将两个升序链表合并为一个新的。

2025-07-08 17:19:33 304

原创 C++--AVL树

在前面学习二叉搜索树时提到,二叉搜索树的查找效率为 O(N),因为当数据有序或接近有序时,构建出来的二叉搜索树是单分支或接近单分支的结构,此时树的高度接近 n,所以最坏情况下二叉搜索树的查找效率为 O(N)。为了应对上面这种情况,两位俄罗斯的数学家 G.M.Adelson-Velskii 和 E.M.Landis 在1962年提出了一种解决办法,当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1 (需要对树中的结点进行调整来实现),即可降低树的高度,从而减少平均搜索长度。

2025-07-08 17:18:15 1230

原创 LeetCode 面试题 02.02. 返回倒数第 k 个节点

题目描述:实现一种算法,找出单向链表中倒数第 k 个节点。

2025-07-07 20:11:11 274

原创 C++--map和set的使用

set 是按照一定次序存储元素的容器,其底层是一棵平衡二叉搜索树 (红黑树),由于二叉搜索树的每个节点的值满足左孩子 < 根 < 右孩子,并且二叉搜索树中没有重复的节点,所以 set 可以用来排序、去重和查找,同时由于这是一棵平衡树,所以 set 查找的时间复杂度为 O(logN),效率非常高。同时,set 是一种 key 模型 的容器,也就是说,set 中只有键值 key,而没有对应的 value,并且每个 key 都是唯一的。

2025-07-07 20:09:53 1284

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除