- 博客(74)
- 收藏
- 关注
原创 每日一练,直击offer -- day3
本文介绍了两个基于位运算的算法题解:1. 在数组中找出唯一出现一次的数字(其他数字均出现三次),通过统计每位比特位总和并取模3来确定目标数字的比特位;2. 在1-N序列中找出缺失的两个数字,利用异或运算分组处理,通过比特位差异将数字分为两组分别异或求解。两个算法均实现了O(N)时间复杂度和O(1)空间复杂度,展示了位运算在解决特定问题中的高效性。
2025-11-23 21:09:07
453
3
原创 MySQL -- 基本查询
本文主要介绍MySQL数据库的基本操作,包括表的增删查改等核心功能。详细讲解了SELECT查询语句的使用方法,涵盖where条件筛选、结果排序、分页查询等操作。同时阐述了INSERT、UPDATE、DELETE语句的具体用法,以及主键冲突处理、批量插入等特殊场景。文章还介绍了聚合函数(COUNT、SUM、AVG等)的应用,通过学生成绩表的实例演示了各种查询技巧。内容包含大量SQL语法示例,适合MySQL初学者快速掌握数据库基本操作。
2025-11-22 14:06:23
977
1
原创 专题三 -- 二分查找
本文系统讲解了二分查找算法及其变种应用。首先介绍了基础的二分查找模板,重点分析了循环条件、中间值计算和边界更新的关键点。随后详细解析了6个经典变种问题:查找目标值的起始和结束位置、搜索插入位置、平方根计算、寻找峰值元素、旋转数组最小值查找。每种变种都提供了清晰的算法思路、边界条件分析和优化后的代码实现。文章强调二分查找的核心在于利用数据的二段性,通过调整左右边界逼近目标值。所有算法均满足O(logn)时间复杂度要求,并针对不同场景给出了具体实现细节和注意事项,为读者提供了实用的二分查找解题框架。
2025-11-22 11:04:19
863
1
原创 MySQL -- 表的约束
本文介绍了MySQL中的表约束及其意义,包括空属性、默认值、列描述、zerofill、主键、自增长、唯一键和外键等约束类型。表约束通过数据类型和其他限制条件,确保数据的合法性、一致性和可靠性。主键用于唯一标识记录,自增长与主键搭配使用,唯一键保证业务字段不重复,外键则维护表间关系。这些约束共同作用,防止数据库变成"垃圾堆",从业务逻辑角度保证数据正确性,是数据库设计的根本基石。
2025-11-20 21:13:18
1069
1
原创 每日一练,直击offer -- day2
本文介绍了两个算法问题的递归解法:1.递归乘法:通过俄罗斯农夫算法实现两数相乘,利用位运算和递归分解,核心是保持A×B乘积不变的情况下不断分解问题;2.栈实现队列:使用两个栈(inStack和outStack)模拟队列操作,通过"懒倒"策略保证元素顺序,仅在需要出队且outStack为空时才整体转移元素。两种解法都体现了递归和数据结构转换的巧妙思想,展示了算法设计中问题分解和逻辑转换的重要性。
2025-11-20 17:51:32
956
1
原创 每日一练 -- day1
本文介绍了两个算法问题:合并区间和连续数组。合并区间通过排序后比较相邻区间的端点来合并重叠区间;连续数组通过将0转为-1并使用前缀和求最长连续子数组。解决思路包括区间端点比较和哈希表记录前缀和。
2025-11-19 23:38:21
1398
1
原创 C++ -- 二叉搜索树
本文介绍了二叉搜索树(BST)的基本概念和实现方法。BST是一种特殊的二叉树结构,其左子树节点值都小于根节点,右子树节点值都大于根节点。文章详细讲解了BST的模板实现,包括节点的查找、插入和删除操作,重点分析了删除节点时处理不同子节点情况的逻辑。此外还介绍了BST的两种应用模型(K模型和KV模型),以及它们的性能特点,最优情况下查找效率为O(logN),最差会退化为O(N)。最后指出AVL树和红黑树可以解决BST退化为单支树的问题,确保树高平衡。
2025-11-19 20:40:15
1100
3
原创 C++ -- list
摘要:list是STL中的双向链表容器,支持高效(O(1))的任意位置插入删除操作,但随机访问效率低(O(n))。其底层采用带头节点的双向循环链表结构,每个节点独立存储数据。list提供丰富的操作接口,包括迭代器、容量查询和元素操作等。与vector相比,list在频繁插入删除场景下性能更优,但空间利用率较低。使用时需注意迭代器失效问题:list删除时仅影响当前迭代器,而vector可能影响所有迭代器。选择容器时应根据具体需求(随机访问或插入删除性能)决定使用vector还是list。
2025-11-18 15:01:16
1036
原创 C++ -- stack和queue
本文介绍了三种容器适配器:stack、queue和priority_queue。stack实现后进先出(LIFO)操作,queue实现先进先出(FIFO)操作,priority_queue基于优先级排序(默认大堆)。它们都是通过封装底层容器(如deque、vector)实现的,提供特定接口来访问元素。文章详细说明了各容器的特性、底层要求、默认实现容器及适用场景,并给出了模拟代码实现。priority_queue特别适用于任务调度、数据排序和事件驱动模拟等场景。最后解释了容器适配器作为设计模式的本质,即通过封
2025-11-17 21:52:50
769
原创 C++ -- 模板
摘要:本文介绍了C++模板的基础和进阶应用。在模板初阶部分,讲解了函数模板的概念、格式和使用方法,通过加法函数示例展示模板如何解决函数重载的代码复用问题。在模板进阶部分,探讨了非类型模板参数、模板特化(全特化和偏特化)的技术,以及模板分离编译时的注意事项。文章重点阐述了模板实例化机制和参数匹配原则,指出模板声明和定义应放在同一文件中以避免链接错误。通过具体代码示例,说明了模板在泛型编程中的灵活性和强大功能。
2025-11-17 20:56:43
772
原创 专题二 -- 滑动窗口
初始化窗口:确定窗口的起始位置和初始大小,通常使用两个指针(如左指针和右指针)来标记窗口的边界。扩展窗口:移动右指针,将新元素纳入窗口,直到窗口满足问题的特定条件(如包含所有目标元素、达到特定大小等)。收缩窗口:一旦窗口满足条件,尝试移动左指针,尽可能缩小窗口,同时保持条件成立,以找到最优解(如最小长度、最大和等)。更新结果:在每次窗口满足条件时,记录当前窗口的状态(如长度、元素和等),并根据问题要求更新全局最优解。重复步骤:继续扩展和收缩窗口,直到右指针遍历完整个数组。
2025-11-17 13:03:48
1352
3
原创 MySQL -- 数据类型
本文介绍了MySQL的主要数据类型及其使用方法。MySQL数据类型可分为整型、小数类型、字符串类型、日期时间类型、枚举和集合等。整型包括tinyint、smallint等5种,各有不同存储范围;小数类型float和decimal需注意精度差异;字符串类型char和varchar在定长/变长存储上各有优劣;日期类型datetime和timestamp在存储方式上存在区别;enum和set分别实现单选和多选功能。文章通过具体创建表和插入数据的示例,详细演示了各类数据类型的使用场景、存储特性及注意事项。
2025-11-16 11:40:08
814
原创 专题1:双指针
本文介绍了双指针算法的两种主要形式:对撞指针和快慢指针,并通过多道力扣题目展示了其应用场景。对撞指针用于顺序结构(如盛水容器问题),而快慢指针适用于环形问题(如快乐数判断)和数组处理(如移动零)。文章详细解析了7个典型题目的解法思路,包括移动零、复写0、快乐数判断、盛水容器、有效三角形个数、两数之和及三数之和等问题。通过具体示例演示了如何运用双指针技巧优化暴力解法,提高算法效率(如将O(n²)降至O(n)),并总结了处理重复元素等边界条件的技巧。
2025-11-15 13:34:16
1012
原创 MySQL -- 库的操作
本文介绍了MySQL数据库的基本操作,主要包括:1)数据库创建语法,可通过CREATE DATABASE指定名称、字符集和校验规则;2)校验规则对数据查询的影响,区分大小写与否会导致不同查询结果;3)数据库操作命令如查看、修改和删除;4)数据库备份恢复方法,使用mysqldump工具导出数据。文中通过具体SQL示例演示了各项操作,并解释了相关参数选项的作用。
2025-11-14 14:17:18
576
原创 MySQL -- 数据库基础
数据库是用于存储和管理结构化数据的系统,相比文件存储具有安全性高、便于查询管理、支持海量数据等优势。主流数据库包括MySQL、Oracle等,其中MySQL采用客户端-服务器架构,通过SQL语言与存储引擎交互。SQL分为DDL(数据定义)、DML(数据操作)和DCL(数据控制)三类。MySQL支持多种存储引擎(如InnoDB、MyISAM),具有平台可移植性,通过数据库管理系统实现对数据的统一管理和安全控制。
2025-11-14 13:00:41
1049
原创 Linux -- 数据链路
本文介绍了数据链路层相关概念与技术要点:1.数据链路由物理线路和通信协议构成,通过适配器实现;2.MAC地址用于局域网节点识别,具有唯一性;3.MTU(最大传输单元)限制数据包大小,超过时需分片处理;4.ARP协议在数据链路层和网络层间工作,通过广播请求和单播响应实现IP到MAC地址的解析;5.分片处理会增加丢包风险,UDP协议受影响较大,而TCP通过MSS协商优化传输;6.详细解析了ARP数据报格式及请求/响应帧的差异。这些概念构成了计算机网络数据链路层通信的基础机制。
2025-10-25 11:17:20
1078
1
原创 Linux -- 网络层
本文介绍了网络层的基本概念和IP协议相关内容。首先阐述了网络层的作用是解决不同主机间报文转发和路径选择问题。详细解析了IP协议格式,包括版本号、首部长度、服务类型、生存时间等关键字段。重点讲解了网段划分原理,解释了网络号和主机号的作用,并对比了传统的五类IP地址划分与CIDR无类别路由方案。此外还介绍了特殊IP地址、解决IP地址短缺的技术(动态分配、NAT、IPv6)、私有与公网IP划分。最后说明了路由表的工作原理和数据包转发过程,通过具体示例展示了路由选择机制。
2025-10-11 21:53:04
1441
1
原创 Linux -- 传输层协议TCP
TCP协议摘要:TCP是一种可靠的、面向连接的传输协议,通过确认应答、超时重传、流量控制等机制确保数据的可靠传输。其核心特性包括:1) 通过三次握手建立连接,四次挥手断开连接;2) 采用滑动窗口机制提高传输效率;3) 使用拥塞控制算法动态调整发送速率;4) 通过字节流方式传输数据,可能产生粘包问题。TCP还处理各种异常情况,如进程终止、机器重启等。协议通过序号、确认号、校验和等字段保证数据的完整性和顺序性,同时利用窗口大小实现流量控制,避免网络拥塞。
2025-10-07 17:11:35
1104
原创 Linux -- 传输层协议UDP
传输层负责数据端到端传输,通过端口号标识接收进程。UDP是一种无连接的传输层协议,具有低延迟、高效率的特点,但不保证可靠性。它采用面向数据报的传输方式,不拆分合并数据,每个数据报最大65507字节。UDP适用于实时应用(如视频会议)、广播和多播等场景。与TCP不同,UDP没有发送缓冲区,仅设接收缓冲区,且无流量控制机制。当需传输大数据时,需在应用层手动分包传输。常见UDP应用包括DNS查询和VoIP等。
2025-09-18 13:47:07
1036
原创 Linux -- 应用层协议Http
HTTP协议是运行在TCP/IP上的应用层协议,定义了客户端与服务器的数据交互格式和流程,实现超文本传输。其本质是"请求-响应"的无连接、无状态通信规则,每次请求独立处理。常用方法包括GET获取资源和POST提交数据。状态码如200(成功)、404(未找到)和302(临时重定向)等指示请求结果,重定向需配合Location头部使用。通过报头字段如Content-Type、Cookie等传递额外信息。
2025-09-16 21:40:51
977
原创 Linux -- 应用层自定义协议与序列化
本文介绍了网络编程中应用层协议的设计与实现,重点讲解了基于TCP的网络计算器项目。在应用层协议部分,阐述了使用JSON进行数据序列化和反序列化的方法,并说明了报文完整性验证的重要性。项目实现方面,详细描述了服务器端和客户端的架构设计:服务器采用线程池处理客户端请求,通过回调函数完成请求解析、计算处理和响应生成;客户端则负责发送计算请求并异步接收处理结果。文章还强调了网络通信中的关键点,如TCP连接管理、数据格式转换和线程同步等。。
2025-09-16 18:29:19
901
原创 Linux -- 基于TCP服务器实现一个简单的电商网站
本文介绍了如何基于TCP协议构建HTTP服务器处理浏览器请求并返回响应。实现分为三层:1) 底层封装TcpSocket类处理TCP连接;2) 中间层TcpServer类管理多进程连接;3) 上层HttpServer类通过HttpRequest解析请求、HttpResponse构建响应。核心流程包括:请求反序列化、参数处理、构建响应头和正文,最后返回给浏览器渲染。文章提供了完整的代码实现思路,并建议使用AI生成前端页面,源代码可在Gitee仓库获取。
2025-09-13 11:35:37
676
原创 Linux --网络基础概念
网络通信发展经历了从独立计算机到广域网的演进过程。早期计算机通过硬盘传输数据效率低下,网络互联实现了数据共享。网络协议是计算机通信的约定标准,OSI七层模型虽理论完整但过于复杂,实际采用TCP/IP四层模型(应用层、传输层、网络层、链路层)。协议本质是分层解决方案,通过封装报头实现数据传输。局域网通信依赖MAC地址,跨网络传输则通过IP地址和路由器实现。数据在传输过程中会经过层层封装和解包,最终由目标主机接收处理。
2025-08-24 21:14:50
594
原创 Linux -- 封装一个线程池
本文介绍了线程池的实现框架及其应用场景。线程池通过维护多个线程来避免频繁创建销毁线程的开销,适用于短时任务、高并发请求等场景。文章详细说明了线程池的核心组件:线程数组、任务队列、条件变量和互斥锁,并阐述了Run、Insert、Start、Wait、Stop等关键函数的实现逻辑。测试结果表明线程池能有效并发执行任务。完整代码已开源在gitee仓库的ThreadPool目录中。
2025-08-21 17:02:51
495
4
原创 Linux -- 手搓简易日志系统
本文介绍了一个自定义日志系统的实现方案。该系统包含时间、日志等级、进程ID等基础信息,支持两种日志刷新策略:屏幕输出和文件写入。通过策略模式设计基类和子类,使用纯虚函数SyncLog()实现不同策略。日志类采用RAII技术,在LogMessage析构时自动调用同步策略,并通过重载<<操作符支持多种数据格式输入。系统还提供了线程安全的锁机制和便捷的宏定义,简化调用方式(如logger(DEBUG,file,line)<<"hello")完整代码已开源在Gitee
2025-08-21 01:56:01
544
原创 Linux -- 线程同步
本文介绍了线程同步中的关键概念:条件变量用于线程等待特定条件成立;竞态条件及其常见场景(如检查后行动、非原子操作等);条件变量相关函数(初始化、等待、唤醒等)。重点讲解了生产者消费者模型,通过阻塞队列解耦生产消费过程,分析了基于BlockingQueue的实现细节(互斥锁、条件变量应用及伪唤醒处理)。同时介绍了POSIX信号量及其在线程同步中的应用,以及基于环形队列的高效生产消费模型实现。两种模型都支持多线程并发操作,其中环形队列方案通过模运算实现环形特性,效率更高。
2025-08-19 16:09:03
1021
原创 Linux -- 线程互斥
本文介绍了多线程编程中的互斥机制。主要内容包括:1)互斥相关概念,如共享资源、临界区和原子性操作;2)互斥量(mutex)的作用和使用方法,通过抢票例子说明不加锁会导致数据竞争问题;3)互斥量的接口函数和实现原理,利用原子交换指令保证互斥;4)互斥量的RAII风格封装实现自动加解锁。互斥机制能确保任一时刻只有一个线程访问临界资源,防止多线程并发时的数据不一致问题。文章详细阐述了互斥量的初始化、加解锁操作及其底层实现机制,并提供了面向对象的封装方法。
2025-08-17 14:10:19
6089
5
原创 Linux -- 线程概念与控制
一个进程中至少有一个线程,线程在进程的内部运行,本质是在进程的地址空间运行。怎么理解这个“ID”呢?.1.1虚拟地址和页表的由来:如果没有虚拟地址以及页表,那么我们数据和代码在内存中就应该是连续存放的,因为每⼀个程序的代码、数据⻓度都是不⼀样的,按照这样的映射⽅式,物理内存将会被分割成各种离散的、⼤⼩不同的块。这里我们可以发现三个不同的线程使用不同的方式结束线程,但是他们的id都是一样的,这是因为三个线程都是逐步的,即复用了上一个线程的地址空间,并且在等待的时候主线程是在等待线程结束才会向下继续执行的。
2025-08-15 21:47:34
878
原创 Linux --进程信号
main函数调⽤insert函数向⼀个链表head中插⼊节点node1,插⼊操作分为两步,刚做完第⼀步的 时候,因为硬件中断使进程切换到内核,再次回⽤⼾态之前检查到有信号待处理,于是切换到sighandler函数,sighandler也调⽤insert函数向同⼀个链表head中插⼊节点node2,插⼊操作的两步都做完之后从sighandler返回内核态,再次回到⽤⼾态就从main函数调⽤的insert函数中继续往下执⾏,先前做第⼀步之后被打断,现在继续做完第⼆步。signal只能捕获信号,对信号进行处理。
2025-07-19 21:16:29
1148
原创 Linux --进程间通信
本文介绍了进程间通信(IPC)的主要方式及其实现原理。重点讲解了管道通信(包括匿名管道和命名管道)的特性、实现机制和编程示例,演示了父子进程通过管道进行单向通信的过程。文章还描述了如何基于管道原理编写进程池,实现父进程与多个子进程的通信。此外,详细阐述了共享内存这一高效IPC方式的系统调用接口(shmget、shmat等)和使用方法,并指出其需要配合管道进行数据同步。最后简要介绍了消息队列和内核管理IPC资源的机制,揭示了通过kern_ipc_perm结构体实现C语言多态的精妙设计。
2025-06-29 16:34:27
904
原创 Linux --静态库和动态库的制作和原理
静态库(.a):程序在编译链接的时候把库的代码链接到可执⾏⽂件中,程序运⾏的时候将不再需要静态库,静态库可以理解为多个.o文件的集合。⼀个可执⾏程序可能⽤到许多的库,这些库运⾏有的是静态库,有的是动态库,⽽我们的编译默认为动态链接库,只有在该库下找不到动态.so的时候才会采⽤同名静态库。有了库我们只需要有头文件和知道对应的调用方法就可以使用库中的函数,不需要每次都造轮子手撕,我们平时使用的c/c++标准库都是这样封装的库,然后将头文件暴露出来给用户调用。这样就可以增加系统查找共享库的路径了。
2025-06-21 15:36:35
875
原创 Linux --Ext系列文件系统
本文重点:1.理解物理磁盘结构2.掌握CHS和LBA地址3.掌握Etx系列文件系统的原理4.理解分区,格式化,路径解析,挂载过程。
2025-06-17 19:44:58
1038
原创 Linux --基础IO
本文系统阐述了Linux系统中文件的本质与操作机制。首先指出Linux将一切设备抽象为文件。重点分析了文件操作的底层原理:1)文件描述符(fd)作为数组下标指向内核管理的file结构体;2)系统调用与库函数的关系,语言层函数是对系统调用的封装;3)缓冲区机制分为全缓冲、行缓冲和无缓冲三种类型,解释了其存在意义和工作原理。通过实验演示了重定向的实现机制和缓冲区在不同场景下的表现,揭示了fork与缓冲区的交互影响。最后指出用户级缓冲区独立于内核缓冲区,并可通过封装系统调用来实现自定义文件读写相关操作
2025-06-13 17:57:03
952
原创 Linux --环境变量,虚拟地址空间
平时我们在写函数的时候都会有参数列表,main函数也是一个函数,那么它也有自己对应的参数可以传递,只是在我们一般写代码中不需要传递,只有在命令行中才可能需要传递使用。main函数一般有三个参数可以传递那么设置main函数参数的意义是什么,同一个程序中可以根据命令行参数,根据选项的不同表现出不同的功能,一些命令指令就是最好的体现,比如 ls -a mkdir -p这些后面都会带参数,实现不同的功能。argc是代码数组中argv char类型指针数组的参数个数,而env是环境变量,一会我们会讲解。
2025-06-05 20:35:33
763
原创 Linux --进程优先级
摘要:进程优先级是Linux调度资源的关键机制,通过PRI和NI值控制进程执行顺序。PRI越小优先级越高,NI(-20至19)用于修正PRI值。Linux采用O(1)调度算法,使用active/expired队列和bitmap快速定位待执行进程,当活跃队列耗尽时交换指针。进程切换通过保存/恢复PCB中的上下文数据实现,而task_struct的链表设计允许进程存在于多队列中。通过offsetof宏可计算结构体成员偏移量,实现从链表节点访问完整进程数据。该机制确保调度效率不受进程数量影响。
2025-06-03 15:45:39
957
原创 Linux --进程状态
本文介绍了进程状态的基本概念和Linux系统中的具体实现。宏观上,进程主要分为运行、就绪、阻塞等状态,其中阻塞状态可分为普通阻塞和挂起状态。Linux系统将进程状态细分为R(运行/就绪)、S(可中断睡眠)、D(不可中断睡眠)、T(停止)、X(死亡)和Z(僵尸)等状态。文章还展示了如何通过ps命令查看进程状态,并用代码示例演示了R/S/Z状态的转换过程,特别是通过父子进程模型说明僵尸进程的产生和孤儿进程的被收养机制。这些状态转换机制是操作系统实现高效进程管理的关键。
2025-06-01 20:44:32
893
原创 Linux --OS和PCB
本文介绍了计算机系统的核心概念,首先阐述了冯诺依曼体系结构的基本原理,包括输入单元、中央处理器和输出单元的运作机制,重点说明内存作为CPU与外设间缓存的重要性。接着讲解了操作系统的定位与功能,包括其对上为程序提供运行环境、对下管理硬件资源的核心作用,并介绍了系统调用和库函数的概念。在进程管理方面,详细说明了进程控制块(PCB)的数据结构task_struct及其分类属性,通过实际代码演示了进程创建、标识符获取等系统调用的使用,验证了父子进程间的数据独立性。
2025-05-31 10:50:02
908
原创 数据结构 --链表
那么还有什么方法可以自己去推导返回值呢?今天把链表重新用c++写了一遍,首先单纯的写一个链表并不困难,无非是定义一个结构体ListNode,设置变量data和下一个指针的地址next,然后完成增删查改的操作,需要注意的是在删除节点的时候记得先保存当前需要删除的节点的下一个节点,然后再删除当前节点并链接节点,否则会导致找不到删除的节点的下一个节点,无法链接。FindResult就好了,这里其实也是类模板的实现,只不过这里是用类型实例化出不同的类,然后实例不同的FindResult,没有具体的类其他的操作。
2025-05-30 17:49:12
1013
原创 Linux -- gdb/cgdb的认识和使用
这里在第五行打了一个断点 b 5 ,然后运行代码 r,代码在第五行这个位置停下了,l/list可以显示10行的代码,剩下的一些使用大家可以自己去尝试。如果监视的表达式在程序运⾏期间的值发⽣变化,GDB 会暂停程序的执⾏,并通知使⽤者。给已有断点追加:condition 2 i==30, 其中2是已有断点编号,没有if。中的变量:如果在函数内部设置观察点,且该函数有同名局部变量,则观察的是。上⾯的基本调试还是⿇烦,虽然是⿊屏,但是还是想看到代码调试。新建断点时添加条件 b n(断点序号) if i==30。
2025-05-28 23:25:58
614
空空如也
如何使用usbasp给arduino刷入固件
2024-09-29
python中使用hidapi与lArduino Leonardo通信
2024-09-28
dxgi截图超时无法正常捕获屏幕
2024-09-25
无法正常使用dxgi截图
2024-09-24
Python使用hid与arduino leonardo被拒绝访问
2024-09-22
导入serial库无法使用
2024-09-21
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅