自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 每日算法题【二叉树】:层序遍历、用层序遍历判断二叉树是否为完全二叉树

设二叉树的根节点所在的层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第二层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的节点的过程就是层序遍历。先用层序遍历将所有二叉树的所有连续节点遍历一遍,当在队列中找到空节点的时候,开始使用循环遍历队列,如果全为空就是完全二叉树,如果不全为空就不是完全二叉树。以根节点为第一层,先将根节点放入队列中,然后上一层节点弹出并打印,再将其下一层子节点放入队列中。

2025-09-02 11:14:34 236

原创 每日算法题【二叉树】:二叉树查找值为x的节点、给定字符串用前序遍历构建二叉树、二叉树的销毁

用前序遍历字符串,将经过的节点(字符)都申请到空间,然后将值放到二叉树中,并接着向下递,直到遇到空节点(字符#)结束递归。使用前序遍历整个二叉树,比较根节点是否为x,不为x就递下去判断左右子节点是否为x。

2025-09-01 21:14:48 153

原创 每日算法题【二叉树】:计算二叉树节点的个数、叶子结点的个数、第k层节点的个数

k为什么要传值而不是地址:因为如果传地址,则遍历左子节点和右子节点递到下一层时都会对同一个k-1。通过前序遍历二叉树,使用三目操作符进行判断,节点为空则返回0,节点不为空递到下一层进行判断并。如何返回k层的节点个数:当k=1时,return 1;并通过递归相加即可得到k层总个数。通过前序遍历二叉树,每递下去一层k-1,k=1时的节点总个数就是结果。​ 而传值才能避免这个问题并保证两子树遍历的层数相同。代表这个不空的根节点。

2025-09-01 21:11:32 421

原创 每日算法题【栈和队列】:栈和队列的实现、有效的括号、设计循环队列

在循环队列中,我们使用取模运算(%)来实现队列指针的循环移动。具体来说,当队尾指针需要向后移动时,我们计算新的队尾位置为 (tail + 1) % capacity,其中 tail 是当前队尾指针的位置,capacity 是队列的容量。这样可以保证当队尾指针达到队列容量时,取模运算会使其重新回到队列的开头,实现了环形结构。在普通的线性队列中,队列指针(如队头指针和队尾指针)的范围是从 0 到队列容量减一。而在循环队列中,队尾指针在达到队列容量时不再继续增加,而是从队列的开头重新开始,形成了一个环形结构。

2025-08-31 12:19:04 510

原创 每日算法题【二叉树】:二叉树的最大深度、翻转二叉树、平衡二叉树

【代码】每日算法题【二叉树】:二叉树的最大深度、翻转二叉树、平衡二叉树。

2025-08-30 16:45:37 545

原创 每日算法题【二叉树】:堆的实现、堆排序的实现、文件中找TopK

将剩余N-K个元素依次与堆顶元素比较,如果比堆顶(k个中最小的元素)元素大则进行替换,替换完进行向下调整,堆中剩余的K个元素就是所求的前K个最小或者最大的元素。前k个最大的元素,则建小堆。前k个最小的元素,则建大堆。

2025-08-30 16:42:34 446

原创 每日算法题【二叉树】:另一棵树的子树、二叉树的构建及遍历

其核心就是给定字符串然后用前序遍历数组来构建二叉树。前序遍历每个节点进行(两颗子树是否相等)的比较。

2025-08-29 15:33:04 277

原创 每日算法题【二叉树】:对称二叉树、二叉树的前中后序遍历

递归思想:首先找到递归条件(根节点为空则直接返回),因为是前序所以先对根节点进行操作,然后通过再次调用函数递到下一层子树的根节点,等最后一层的子树的根节点也为空,再依次返回。第二步:通过前序遍历,将节点依次放入数组中,需注意索引要传地址,这样递归下去才会是同一个索引。利用递归的思想,前序遍历就是先遍历根节点,再遍历左子树,最后是右子树。第一步:计算二叉树的节点总数并申请对应的数组空间。

2025-08-29 15:30:55 334

原创 每日算法题【链表】:随机链表的复制、单链表的接口实现

【代码】每日算法题【链表】:随机链表的复制、单链表的接口实现。

2025-08-27 15:24:36 337

原创 每日算法题【链表】:链表分割、链表的回文结构

用指针遍历原链表,小于x的不做处理,大于等于x的尾插到原链表上,并删除之前的节点。O(n) - 遍历链表3次(找中点、反转、比较)O(1) - 只使用了固定数量的指针变量。

2025-08-27 15:22:09 660

原创 每日算法题【二叉树】:单值二叉树、相同的树

通过前序遍历,比较每个根节点与其左右子树的根节点是否相同;相同接着递归下去比较,如果都相同就会把所有的true返回;不相同就会停止递归,把false返回。使用前序遍历两棵二叉树,然后判断两棵二叉树节点的情况,一共分为两大类四种情况。

2025-08-24 13:05:18 446

原创 每日算法题【链表】:相交链表、环形链表、环形链表II

其次,我们让两个指针向前遍历,当两指针相遇时,在相遇点放置一个相遇指针meet,然后通过循环,meet指针在相遇点走,head指针在头节点走,两指针相遇时,此点即为入环的第一个结点。链表如果成环,快指针一次走两步,慢指针一次走一步。此时证明了链表成环。首先,我们申请两个指针,一个是快指针fast(一次走两步),一个是慢指针slow(一次走一步)。首先,我们申请两个指针,一个是快指针fast(一次走两步),一个是慢指针slow(一次走一步)。求交点:长的链表先走(长度差)步,再同时走,第一个相同的就是交点。

2025-08-24 13:00:45 844

原创 每日算法题【链表】:链表的中间节点、返回倒数第k个节点、合并两个有序链表

循环遍历比较两个链表,谁小谁就尾插到新链表当中,谁尾插谁加加,最后再判断一下有没有没比的,全放在新链表的最后。使用快慢指针,快指针走两步,慢指针走一步,快指针指向空,慢指针所指向的节点就是中间节点。定义两个前后指针,之间相差k步,当后指针指为空的时候,前指针所指向的节点就是目标节点。

2025-08-23 16:16:53 597

原创 每日算法题【链表】:移除链表元素、反转链表

创建一个新链表,将不等于这个值的节点都尾插到新链表当中,最后返回新链表。取原链表中的节点,然后头插到newhead新链表中。

2025-08-22 13:28:13 270

原创 每日算法题【顺序表】:删除有序数组中的重复项、合并两个有序数组

定义三个下标指针,ptr1指向数组1的最后一个元素位置,ptr2指向数组2的最后一个元素的位置,ptr指向数组1的最后一个下标位置(因为我们要让ptr1和ptr2从后向前遍历元素进行比较,将大的放在最后一个下标位置ptr)

2025-08-21 15:29:19 227

原创 每日算法题【顺序表】:轮转数组、移除元素

通过创建一个新数组,对原数组的数据进行重新排序。

2025-08-20 14:32:11 221

原创 每日算法题【顺序表】:消失的数字

所以:1.遍历正常数组(外层循环)拿一个数出来,进行内层循环(遍历的原数组)的比较。3.如果原数组有和这个数字相等的,则将标记置为0并break。4.如果遍历完整个原数组都无与之相等的数字,则当退出循环时,标记不会被置为0。法一:先排序,再依次查找,如果下一个值不等于前一个+1,则下一个值就是消失的数字。的所有数字总和是唯一的,缺少一个数字会导致实际和比理论和小 恰好那个数字的值。的理论总和,然后减去数组中所有数字的实际总和,差值就是消失的数字。重点:当正常数组中的数,原数组没有,则查找到消失的数字。

2025-08-19 18:35:50 265

原创 C++ 仿RabbitMQ实现消息队列项目

在后端开发中,尤其是分布式系统里,跨主机之间使用生产者消费者模型,是非常普遍的需求。因此,我们通常会把阻塞队列封装成一个独立的服务器程序,并且赋予其丰富的功能。这样的服务程序我们就称为消息队列(Message Queue,MQ)。其中RabbitMQ是一个非常知名的、功能强大且广泛使用的消息队列。本项目就仿照RabbitMQ模拟实现一个简单的消息队列。开发环境:Linux(Ubuntu-22.04)、VSCode/Vim、g++/gdb、Makefile开发主语言:C++Protobuf。

2025-08-14 23:53:00 1183 2

原创 在线五子棋对战项目

本篇博客只为记录实现五子棋项目的知识记录和代码的实现,不具备教学意义。本项目主要实现一个网页版的五子棋对战游戏,其主要支持以下核心功能:开发环境:核心技术:2.1.2 启动服务2.1.3 获取临时密码2.1.4 设置数据库密码2.1.5 登录查看字符集是否正常2.2 2.2.1 介绍WebSocket 是从 HTML5 开始支持的一种网页端和服务端保持长连接的消息推送机制。WebSocket 协议本质上是⼀个基于 TCP 的协议。为了建⽴⼀个 WebSocket 连接

2025-06-30 22:47:03 770

原创 计算机网络 : NAT、代理服务、内网穿透

本文将深入解析以下核心内容:NAT技术:揭秘私有IP与公网IP的转换机制,以及NAPT如何通过“IP+端口”映射解决多设备共享出口问题。代理服务:对比正向代理(隐藏客户端)与反向代理(保护服务器)的工作原理,探讨其在负载均衡、科学上网等场景的应用。内网穿透:从FRP工具的实现到P2P打洞技术,剖析如何绕过NAT限制直接访问内网设备。

2025-06-11 09:39:25 890

原创 计算机网络 : 数据链路层

作为网络通信的“最后一公里”,数据链路层通过帧封装、MAC寻址、差错检测等技术,为上层协议提供了无差错的通信基础。本文将系统剖析数据链路层的核心机制,包括:以太网技术:详解帧结构、MAC地址的作用,以及MTU(最大传输单元)如何影响IP分片和TCP/UDP传输效率。ARP协议:揭示IP地址与MAC地址的动态映射过程,并分析ARP欺骗的安全隐患。交换机原理:探索如何通过MAC地址学习和冲突域隔离优化局域网性能,对比Hub与交换机的本质差异。

2025-06-11 09:33:14 1184

原创 计算机网络 :网络层

本文将深入解析网络层的工作原理,涵盖以下核心内容:IP协议:详解IPv4报文格式、分片与重组机制,以及TTL、校验和等关键字段的作用。地址管理:从传统的A/B/C类划分到CIDR无类别域间路由,揭示子网掩码如何高效分配IP资源。路由技术:探索路由表的工作机制,分析数据包如何通过“下一跳”策略穿越复杂网络拓扑。NAT与私有地址:解释如何通过地址转换技术缓解IPv4短缺问题,以及私有IP与公网IP的协作方式。

2025-06-11 09:26:30 1172

原创 计算机网络 : 传输层协议UDP与TCP

在计算机网络中,传输层是实现端到端通信的关键,而UDP和TCP则是传输层最核心的两种协议。它们各自具有独特的特点和适用场景,为不同的网络需求提供了多样化的解决方案。UDP(用户数据报协议):以无连接、不可靠但高效的方式传输数据,适用于实时性要求高、允许少量丢包的应用,如视频流和DNS查询。TCP(传输控制协议):通过连接管理、确认应答、流量控制等机制确保数据的可靠传输,广泛应用于文件传输、网页浏览等对数据完整性要求严格的场景。本文将深入解析UDP与TCP的协议格式、工作机制、优缺点以及典型应用场景,

2025-06-11 09:07:07 1122

原创 计算机网络 : 应用层协议HTTP

本文将从HTTP的基本概念出发,深入解析其请求与响应格式、方法、状态码、头部字段等核心内容,并通过代码示例展示HTTP服务器的实现原理。此外,还将探讨HTTPS的安全机制、Cookie与Session的工作原理,以及HTTP协议的演进历史。

2025-06-11 08:35:56 1492

原创 C++11 : 智能指针

智能指针不仅能够有效避免内存泄漏,还能简化代码逻辑,提升程序的健壮性和可维护性。C++11标准库提供了多种智能指针类型,包括unique_ptr、shared_ptr和weak_ptr,分别适用于不同的资源管理场景。本文将详细介绍智能指针的使用场景、设计原理、标准库实现以及常见问题(如循环引用和线程安全),并通过丰富的代码示例帮助读者深入理解其工作机制和最佳实践。

2025-06-02 19:59:40 788

原创 计算机网络 : 应用层自定义协议与序列化

本文深入探讨了如何自定义应用层协议,并通过序列化与反序列化技术实现结构化数据的网络传输。内容涵盖以下关键点:- 应用层协议的基本概念与设计方法- 序列化与反序列化的原理与实现(以JSON为例)- TCP全双工通信的本质与Socket封装- 流式数据的边界处理(解决粘包/半包问题)- 守护进程的实现与进程关系管理- 完整网络计算器服务的代码实现

2025-06-02 19:58:52 1391

原创 C++异常

在程序开发中,错误处理是确保代码健壮性的关键环节。C++ 通过异常机制提供了一种强大的错误处理方式,它允许开发者将错误检测与处理逻辑分离,使代码更加清晰和模块化。相较于传统的错误码返回方式,异常机制能够携带更丰富的错误信息,并通过调用栈展开实现跨函数边界的错误传递。本文将详细介绍 C++ 异常的概念、使用方法、标准库异常体系以及异常安全等核心内容,帮助你掌握这一重要的编程技术。

2025-05-27 21:28:21 1081

原创 C++11

C++11 是 C++ 语言的一次重大更新,引入了许多现代化特性,显著提升了开发效率和代码性能。本文深入解析了 C++11 的核心特性,包括列表初始化、右值引用与移动语义、可变参数模板、`lambda` 表达式、包装器等,并结合代码示例和底层原理分析,帮助读者掌握这些特性的使用场景与实现机制。无论是初学者还是经验丰富的开发者,都能从中获得对 C++11 的全面理解,从而编写更高效、更现代的 C++ 代码。

2025-05-27 21:13:49 1151

原创 C++数据结构 : 哈希表的实现

哈希表(Hash Table)是一种高效的数据结构,它通过哈希函数将键(Key)映射到存储位置,从而实现平均时间复杂度为O(1)的快速查找、插入和删除操作。本文将详细介绍哈希表的核心概念,包括哈希函数的设计、哈希冲突的解决方法(开放定址法和链地址法),并通过C++代码实现一个完整的哈希表。无论你是初学者还是希望深入理解哈希表内部机制的开发者,本文都将为你提供清晰的理论指导和实用的代码示例。

2025-05-27 20:45:06 1421

原创 C++数据结构 : map和set的使用

关联式容器中,map和set是最常用的两种,它们基于红黑树(一种平衡二叉搜索树)实现,提供了高效的增删查改操作,时间复杂度为O(log n)。set是纯关键字(key)的集合,适合需要快速判断元素是否存在的场景;map则是键值对(key-value)的集合,适合需要通过关键字快速查找对应值的场景。此外,multiset和multimap是它们的变体,支持重复关键字的存储。本文将详细介绍map和set的基本用法,包括构造、遍历、增删查改等操作,并通过丰富的代码示例帮助读者掌握这些容器的核心功能。

2025-05-27 20:01:45 906

原创 C++数据结构 : 二叉搜索树

二叉搜索树(BST)是一种高效的数据结构,通过有序的树形存储实现快速查找、插入和删除操作。其核心特性是:左子节点的值 ≤ 当前节点值 ≤ 右子节点的值。本文将详解BST的原理、实现及应用,包括基础操作、性能分析,以及`key`和`key/value`两种模式的代码实现,帮助你在实际开发中灵活运用这一结构。

2025-05-27 19:48:03 1055

原创 计算机网络 : Socket编程

本文将从基础的UDP和TCP协议出发,逐步介绍Socket编程的核心概念和实现方法。内容涵盖:UDP编程:介绍无连接通信的实现,包括地址转换、本地环回、Echo服务器和字典服务器的开发。TCP编程:深入讲解面向连接的通信,包括多进程、多线程和线程池版本的服务器实现,以及远程命令执行等实际应用。通过代码示例和详细注释,读者可以快速掌握Socket编程的核心技术,并能够根据需求开发出高效、稳定的网络应用程序。

2025-05-16 20:45:49 1253

原创 计算机网络 : 网络基础

本博客将系统介绍计算机网络的基础知识,包括网络的发展背景、核心协议(如TCP/IP)、协议分层模型(OSI与TCP/IP)、网络传输流程(局域网与跨网络通信)以及Socket编程的基本概念。无论你是初学者还是希望巩固基础的技术爱好者,都能从这里获得清晰的网络知识框架和实践指导。

2025-05-16 20:34:58 1407

原创 操作系统 : 线程同步与互斥

本文将系统性地介绍线程同步与互斥的基本概念、实现原理及实际应用。内容涵盖以下方面:线程互斥:深入讲解临界资源、临界区的概念,以及互斥量(mutex)的实现与使用;线程同步:探讨条件变量、生产者消费者模型及其应用场景。线程池设计:分析线程池的工作原理、实现方式及其性能优化。线程安全与重入问题:讨论线程安全与可重入函数的区别与联系。常见锁概念:解析死锁的成因及避免策略。STL容器与智能指针的线程安全性:评估标准库在多线程环境下的表现。

2025-05-11 20:03:12 858

原创 操作系统 : 线程概念与控制

本文将深入探讨线程的基本概念、Linux中的线程实现原理、线程与进程的区别,以及线程的创建、终止、等待和分离等控制方法。此外,我们还将分析线程的优缺点、异常处理机制,并通过源码解析帮助读者理解线程在操作系统底层的实现细节。

2025-05-08 20:04:32 1113

原创 操作系统 : Linux进程信号

理解信号的工作原理对于深入掌握Linux系统编程至关重要。信号的处理涉及多个层面:从信号的产生、保存到最终的捕捉与处理,每一步都体现了操作系统对进程管理的精巧设计。本文将系统性地介绍Linux信号机制,涵盖以下核心内容:信号的基本概念:信号是什么?它是如何工作的?信号的产生方式:从终端按键到系统调用,多种触发信号的途径。信号的保存与阻塞:内核如何管理未决信号?信号屏蔽字的作用。信号的捕捉流程:用户态与内核态的切换,信号处理函数的执行机制。高级话题:可重入函数、volatile关键字、SIGCHLD信号的应用

2025-05-08 19:54:54 1182

原创 操作系统 : Linux进程间的通信

在操作系统中,进程间通信(IPC)是实现多进程协作的关键技术。由于每个进程拥有独立的地址空间,必须依赖特定的IPC机制来交换数据或同步操作。本文主要讲述:管道(Pipe)匿名管道:父子进程间单向通信,基于内核缓冲区。命名管道(FIFO):任意进程间通信,通过文件系统路径访问。System V IPC共享内存:高效大数据传输,直接映射到进程地址空间。消息队列:结构化消息传递,支持异步通信。信号量:保护临界资源,实现进程同步。实战应用进程池任务分发客户端-服务器通信模型

2025-04-23 10:04:43 903

原创 操作系统 : Linux库制作与原理

本文将深入探讨Linux库的制作与原理,涵盖以下内容:静态库和动态库的生成与使用方法;库的搜索路径配置技巧;ELF文件格式的详细解析;程序从编译到加载的全过程剖析;静态链接与动态链接的核心机制。

2025-04-23 09:50:51 814

原创 操作系统 : Ext系列文件系统

本文将从磁盘的物理结构出发,逐步解析Ext文件系统的设计原理与实现细节。我们将探讨:磁盘的物理与逻辑结构:包括CHS寻址与LBA地址转换,理解数据在磁盘上的存储方式。文件系统的核心概念:如块(Block)、分区(Partition)、inode等,揭示文件系统的组织方式。Ext2文件系统的架构:深入分析块组(Block Group)、超级块(Super Block)、目录结构等关键组件。文件访问机制:从路径解析到挂载分区,完整展现文件读取的底层逻辑。软硬链接的对比与应用

2025-04-11 10:24:06 860

原创 操作系统 : Linux基础IO

本文将从基础概念出发,深入解析Linux I/O的核心机制:文件本质:理解Linux中“文件”的广义定义,包括普通文件、设备、目录等,以及文件操作的底层逻辑。系统调用与库函数:对比C标准库函数(如fopen、printf)和系统调用(如open、write),揭示缓冲区的关键作用及其对性能的影响。文件描述符(fd):探讨fd的分配规则、重定向原理,以及如何通过dup2实现输入输出流的灵活控制。“一切皆文件”的实现:分析Linux如何通过file_operations结构体统一管理硬件设备与抽象资源

2025-04-11 10:02:22 373

本文章是本人在学习初阶数据结构的随手笔记,不具有任何教学功能,仅供参考

本文章是本人在学习初阶数据结构的随手笔记,不具有任何教学功能,仅供参考

2025-03-25

C语言Goodnotes笔记

本资源是自己在学习C语言的随手笔记,不具有任何教学功能,仅供参考。

2025-03-25

空空如也

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

TA关注的人

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