- 博客(241)
- 资源 (17)
- 收藏
- 关注
原创 使用Go语言实现线程安全的Map
自定义线程安全的SyncMap泛型支持:灵活适配不同类型的键值。线程安全:支持高并发场景的安全访问。可扩展性:易于添加更多功能,如合并操作、条件更新等。通过本文的实现与示例,希望您能更好地理解和应用线程安全Map,构建健壮的并发应用。
2024-11-25 23:24:23
980
1
原创 使用 Go 语言封装 MinIO 相关操作
MinIO 是一个高性能的对象存储服务,兼容 Amazon S3 API,广泛用于存储和管理海量数据。在实际开发中,封装一个便于使用的 MinIO 操作包,可以帮助我们简化操作逻辑,提高代码的可读性和复用性。初始化 MinIO 客户端上传文件下载文件列出文件删除文件获取文件的预签名 URL通过封装 MinIO 的常用操作,我们可以极大简化代码逻辑,提高开发效率。在实际项目中,可以根据需求进一步扩展功能,例如支持更多的操作、增加日志功能或通过配置文件动态加载参数等。
2024-11-24 22:06:26
1278
原创 Go语言开发的源代码行数统计工具
是一个开源工具,用于统计各种编程语言的源代码文件数量和代码行数。它支持多种语言,易于扩展以包括自定义语言。简单易用,可以帮助开发者快速了解代码库并跟踪变化。页面下载预编译的二进制文件。
2024-11-21 10:53:34
1527
原创 使用gRPC基于Protobuf传输大文件或数据流
在gRPC中,服务和消息的定义是通过.proto文件进行的。例如,定义一个文件传输服务,可以在这里定义了一个服务,包含了一个Upload方法,该方法接受一个FileChunk类型的流,并返回一个状态。
2024-05-10 14:02:34
2906
原创 极光推送Go语言服务端SDK
jpush-api-golang-client项目地址:https://github.com/Scorpio69t/jpush-api-golang-client概述JPush’s Golang client library for accessing JPush APIs. 极光推送的 Golang 版本服务器端 SDK。该项目参考ylywyn结合极光推送官方文档而来。(原项目年久失修,有很多新特性都没有提供,本项目旨在将其完善,方便大家使用,后续会持续更新,不足之处欢迎大家指正,谢谢~)参考R
2021-12-31 17:45:59
1496
6
原创 HackRF-AIS信号的采集与解调
目录AIS信号采集与解调1、硬件设备2、系统准备3、软件准备4、进行实验(需要去有船只经过的江边才能采集到信号,本次实验于重庆嘉陵江边进行)5、AIS信息解译AIS解调后数据源可去一下连接获取AIS信号采集与解调1、硬件设备 硬件设备采用HackRF One,HackRF是一款全开源的硬件项目,其目的主要是为了提供廉价的SDR(软件定义无线电)方案,作者Mike Ossmann在第一版HackRF Jawbreaker时通过Kickstart融资成功,之后Mike Ossmann开始进行了第二版Ha
2021-10-25 16:28:21
2477
4
原创 c/c++ 实现三角函数(不使用库函数) sin/cos/tan/cot
在许多嵌入式系统或计算平台中,可能不方便使用标准数学库函数。在本篇博客中,我们将使用 泰勒展开 来实现常见的三角函数:sin(x)、cos(x)、tan(x) 和 cot(x),而不依赖任何库函数。通过手动实现这些数学公式,我们可以更好地理解三角函数的计算原理,同时为那些受限的环境提供一种实现方案。泰勒展开是数学中一个非常重要的公式,它能够将任何在某点可导的函数展开为一个无限级数。对于三角函数,我们可以利用其在0点的泰勒级数展开来近似计算函数值。sinxx−x33!x55!−。
2020-03-23 22:57:08
5095
1
原创 【Rust学习之路】第 0 章:理解 Rust 的核心哲学
Rust语言的核心哲学强调"安全第一,性能第二,易用性第三"。其独特之处在于编译时保证内存安全的机制:所有权系统、借用检查和生命周期管理。Rust通过严格的规则(如禁止数据竞争、悬垂引用等)在编译阶段消除常见内存错误,同时保持C++级别的性能。这种设计虽然带来陡峭的学习曲线(需要理解borrow checker的严格限制),但能显著提高代码可靠性。其他关键特性包括零开销抽象、强大的类型系统,以及优秀的工程化工具链(如Cargo)。建议学习者从核心概念入手,先理解设计理念再实践。
2025-12-18 17:49:09
644
原创 【RUSTFS】rustfs的go语言sdk
RustFS Go SDK - 高性能对象存储客户端库 RustFS Go SDK 是一个专为 RustFS 对象存储系统设计的高性能 Go 客户端库,完全兼容 S3 API。提供简洁易用的接口,支持完整的存储操作,包括桶管理、对象上传下载、分片上传和预签名 URL 生成等核心功能。 主要特性: ✅ 完整 S3 API 兼容 ✅ 流式传输大文件支持 ✅ 预签名 URL 安全访问 ✅ 完善的错误处理与重试机制 快速开始:通过 go get 安装后,即可轻松初始化客户端并执行存储操作,支持从文件、数据流等多种方
2025-12-05 16:38:03
753
1
原创 【LeetCode】115. 不同的子序列
本文介绍了求解字符串s中子序列t出现次数的动态规划方法。通过构建二维DP数组dp[i][j]表示s前i个字符中t前j个字符出现的次数,当s[i-1]=t[j-1]时可以选择匹配(dp[i-1][j-1])或不匹配(dp[i-1][j]),否则只能不匹配(dp[i-1][j])。边界条件为dp[i][0]=1(空字符串子序列)和dp[0][j]=0(j>0)。给出了二维DP、滚动数组优化和递归+记忆化三种解法,时间复杂度均为O(n*m)。最优解法使用二维DP,而滚动数组优化可将空间复杂度降至O(m)。典
2025-11-15 20:35:49
982
原创 【LeetCode】114. 二叉树展开为链表
本文介绍了将二叉树展开为链表的算法。题目要求展开后的链表顺序与二叉树先序遍历结果相同,且要求使用原地算法(O(1)额外空间)。主要方法包括:递归DFS+存储节点列表(O(n)空间)、递归DFS+原地修改(最优解)、迭代DFS+栈以及Morris遍历(真正的O(1)空间)。重点分析了后序遍历的原地修改技巧,即先处理子树再连接节点,通过找到左子树的最右节点来连接右子树。最优解法时间复杂度O(n),空间复杂度O(h)。文章还讨论了不同树结构的处理策略和边界条件,提供了清晰的算法流程图和复杂度分析。
2025-11-15 20:34:35
971
原创 【LeetCode】111. 二叉树的最小深度
本文探讨了二叉树最小深度的计算问题。关键点在于区分最小深度与最大深度的定义差异,特别是当树只有一侧子树时的处理方式。文章提出了两种主要解法:递归DFS和迭代BFS。递归DFS通过分情况处理空子树和叶子节点,确保正确计算路径长度;迭代BFS则利用队列实现层序遍历,找到第一个叶子节点即返回当前深度。两种方法时间复杂度均为O(n),但空间复杂度不同(递归O(h),BFS O(w))。文中还分析了典型边界情况,并强调必须到达真实叶子节点而非仅中间节点的注意事项。优化后的递归DFS代码简洁高效,是推荐解法。
2025-11-13 21:47:40
776
原创 【LeetCode】110. 平衡二叉树
本文探讨了平衡二叉树的判断问题。平衡二叉树的定义是任意节点的左右子树高度差不超过1。最优解法采用自底向上的递归方法,在计算高度的同时检查平衡性,时间复杂度为O(n)。关键技巧包括:使用-1标记不平衡状态实现剪枝优化;递归计算子树高度;及时终止不平衡路径的计算。文章通过示例和算法对比详细分析了各种解法的优缺点,强调自底向上递归方法在时间和空间复杂度上的优势,是解决平衡二叉树判断问题的经典方案。
2025-11-13 21:46:05
661
原创 【LeetCode】109. 有序链表转换二叉搜索树
有序链表转平衡二叉搜索树:给定升序链表,将其转换为平衡的二叉搜索树。核心思路包括快慢指针找中点递归构建、转换为数组后处理、中序遍历模拟等方法。最优解使用快慢指针或中序遍历,时间O(n),空间O(log n)。相比数组版本,链表因无法随机访问需额外处理中点查找问题。关键技巧包括链表断开、递归分割和全局指针跟踪。
2025-11-13 21:18:55
938
原创 【LeetCode】108. 将有序数组转换为二叉搜索树
文章摘要: 题目要求将升序数组转换为平衡二叉搜索树。解题核心在于利用数组有序特性,通过分治策略选择中间元素作为根节点,递归构建左右子树以保证平衡性。提供了四种解法:递归(中间偏左/右)、迭代法和中序遍历模拟,时间复杂度均为O(n)。关键点包括中点选择、递归边界处理和BST性质维护,最终实现高度平衡的BST构建。扩展探讨了平衡性验证、重复元素处理等相关问题。
2025-11-13 21:17:19
950
原创 【LeetCode】107. 二叉树的层序遍历 II
文章摘要 这道题目要求在二叉树的层序遍历基础上实现自底向上的输出。核心解法是通过BFS广度优先搜索进行常规层序遍历后反转结果,或使用头插法直接构建倒序结果。BFS+反转法时间复杂度为O(n),空间复杂度O(n),是最直观的解决方案;BFS+头插法避免了反转步骤;DFS递归则利用递归特性但需要最后反转。典型用例包括完整二叉树、单节点树和空树,通过队列实现分层处理是关键。反转操作或头插法是实现自底向上输出的核心技巧。
2025-11-09 12:13:58
847
原创 【LeetCode】106. 从中序与后序遍历序列构造二叉树
这篇文章摘要介绍了从中序和后序遍历序列构造二叉树的算法。文章通过示例分析和递归分治思想,解释了如何利用后序遍历的最后一个元素作为根节点,结合中序遍历分割左右子树。最优解法采用哈希表存储中序索引,实现O(n)时间复杂度。与105题前序构造对比,后序构造需要调整递归顺序(先右后左),并给出了详细算法流程图和复杂度分析。最终通过递归+哈希表的方法高效重建二叉树结构。
2025-11-09 12:04:33
1028
原创 【LeetCode】105. 从前序与中序遍历序列构造二叉树
本文介绍了如何根据二叉树的前序和中序遍历序列重构二叉树。关键思路是利用前序遍历确定根节点,通过中序遍历划分左右子树,并递归进行构建。最优解法采用哈希表存储中序遍历的节点索引,实现O(1)的根节点定位,使整体时间复杂度降为O(n)。文中详细分析了遍历序列的特点、递归分治的过程,并通过示例图解和复杂度比较,展示了不同方法的优劣。该算法是理解树遍历和递归思想的经典案例。
2025-11-08 17:46:19
753
原创 【LeetCode】104. 二叉树的最大深度
本文介绍计算二叉树最大深度的算法,包括递归DFS、迭代BFS和迭代DFS三种解法。递归DFS最简洁优雅,时间复杂度O(n),空间复杂度O(h);迭代BFS通过层序遍历实现,空间复杂度O(w);迭代DFS使用栈模拟递归过程。关键思路是:最大深度等于左右子树最大深度加1,适合作为理解二叉树遍历和递归思想的入门题目。
2025-11-08 17:39:09
1099
原创 【LeetCode】103. 二叉树的锯齿形层序遍历
该题目要求实现二叉树的锯齿形层序遍历,即在常规层序遍历基础上,交替改变每层的遍历方向(先从左到右,再从右到左)。解题核心是使用BFS队列逐层处理节点,并根据当前层数(0-indexed)的奇偶性决定是否反转当前层的节点值列表。时间复杂度为O(n),空间复杂度为O(n)。关键步骤包括:队列初始化、分层处理节点、方向控制和结果反转。该算法能有效处理各种二叉树结构,如完全二叉树、单节点树等,确保输出符合要求的锯齿形遍历序列。
2025-11-06 22:51:20
831
原创 【LeetCode】102. 二叉树的层序遍历
二叉树的层序遍历(BFS)是经典算法题,要求逐层从左到右访问节点并返回分层列表。最优解法使用队列实现BFS:初始化队列后,记录当前层节点数,循环处理每个节点时将其子节点入队,最后收集每层结果。时间复杂度O(n)(访问所有节点),空间复杂度O(n)(队列存储)。关键点在于分层处理:通过记录每层节点数确保输出格式正确,同时处理空树等边界情况。该算法是树遍历的基础应用,适合完全二叉树、链状树等各种树结构。
2025-11-06 22:45:51
1219
原创 【LeetCode】101. 对称二叉树
文章摘要: 本题要求判断二叉树是否轴对称。核心思路是递归或迭代比较左右子树的镜像位置:左子树的左节点对应右子树的右节点,左子树的右节点对应右子树的左节点。递归法代码简洁,时间复杂度O(n),空间复杂度O(h);迭代法(BFS/DFS)虽然空间复杂度可能达到O(n),但更直观易懂。关键点在于处理边界条件(空节点比较)和同步遍历镜像节点。典型测试用例包括完全对称树、结构不对称树和单节点树等情况。最优解推荐递归实现,既高效又易于理解。
2025-11-05 22:10:35
846
原创 【LeetCode】100. 相同的树
摘要 题目要求判断两棵二叉树是否完全相同,包括结构和节点值。核心解法是通过递归或迭代方式同步遍历两棵树:1) 先检查边界条件(空节点情况);2) 比较当前节点值;3) 递归/迭代比较左右子树。递归法最优,时间复杂度O(n),空间复杂度O(h)。也可用BFS/DFS迭代实现,分别使用队列或栈同步处理节点。典型情况包括:完全相同的树(返回true)、结构不同或节点值不同(返回false)。关键技巧在于同步访问对应节点并进行比较。
2025-11-05 22:06:13
1016
原创 【LeetCode】99. 恢复二叉搜索树
二叉搜索树恢复问题要求交换两个错误节点的值来修复BST。通过中序遍历的递增性质,可以高效检测出错误节点:当出现前节点值大于当前节点值时记录逆序对。相邻交换只需交换单个逆序对,非相邻交换则需交换第一个逆序对的前节点和最后一个逆序对的后节点。最优解法采用O(1)空间的Morris遍历,在遍历过程中动态修改树结构并记录错误节点,最后进行值交换。时间复杂度O(n),空间复杂度O(1)。
2025-11-04 20:41:43
722
原创 【LeetCode】98. 验证二叉搜索树
本文介绍了验证二叉搜索树(BST)的方法。BST需满足节点左子树严格小于当前节点,右子树严格大于当前节点,且左右子树也是BST。解题核心在于验证三个约束条件:节点值在正确范围内、子树符合BST定义、中序遍历结果严格递增。提供了三种算法:1)递归传递上下界(最优解,O(n)时间,O(h)空间);2)中序遍历递归验证(利用BST中序递增性质);3)中序遍历迭代实现(避免递归栈溢出)。关键难点在于处理节点值的严格大小关系和整数边界问题。通过维护每个节点的合理范围,可以高效判断是否为有效BST。
2025-11-04 20:29:19
759
原创 【LeetCode】97. 交错字符串
本文探讨了交错字符串问题,即判断字符串s3是否能由s1和s2交替组合而成。通过动态规划方法解决该问题,其中状态dp[i][j]表示s1前i个字符和s2前j个字符能否组成s3前i+j个字符。状态转移方程考虑字符匹配情况,并可通过滚动数组优化空间至O(n)。此外,还介绍了记忆化递归和BFS搜索两种替代解法。关键点包括:长度验证、保持字符相对顺序、以及多种路径选择的处理方式。时间复杂度为O(mn),其中m和n分别为s1和s2的长度。
2025-11-02 11:31:42
1181
原创 【LeetCode】95. 不同的二叉搜索树 II
本文讨论了生成所有由n个不同节点构成的二叉搜索树的问题。核心思路是通过递归分治,枚举每个数字作为根节点,并递归构造左右子树的所有可能组合,最后将左右子树进行笛卡尔积组合。文章详细分析了二叉搜索树的性质、递归构造过程(附流程图解)、记忆化优化策略以及复杂度比较。特别强调了当n=3时的5种可能构造示例,并提供了递归终止条件、根节点选择、子树组合等关键实现要点。该问题时间复杂度与卡塔兰数相关,记忆化优化可将时间复杂度降至O(Cn)。
2025-11-02 11:27:35
837
原创 【LeetCode】94. 二叉树的中序遍历
二叉树的中序遍历要求按照左子树-根节点-右子树的顺序访问节点,输出节点值序列。题目给出了四种实现方法:递归法(最简单直观)、迭代法(显式栈模拟递归)、颜色标记法(统一遍历模板)和Morris遍历法(O(1)空间复杂度)。其中递归法代码最简洁,时间复杂度均为O(n),空间复杂度递归和显式栈为O(h)(树高),Morris遍历最优为O(1)。关键点包括处理空树、单节点等边界情况,Morris遍历需注意维护线索指针。
2025-10-30 22:51:26
833
原创 【LeetCode】92. 反转链表 II
摘要 题目要求在单链表中反转指定区间[left, right]的节点。主要方法包括:头插法(最优,O(n)时间O(1)空间)、常规反转子链后接回、递归解法(reverseN + 偏移)和栈辅助法。关键点在于精确定位边界节点,处理指针连接顺序。使用哑节点简化头部操作,注意边界条件如left=1或right为链表尾部等情况。各种方法时间复杂度均为O(n),但空间复杂度不同,头插法和常规反转最优。
2025-10-30 22:47:10
1133
原创 【LeetCode】91. 解码方法
本文介绍了解决"解码方法"问题的动态规划解法。题目要求将数字字符串解码为字母组合(1-26对应A-Z),计算所有可能的解码方式。核心思路是使用动态规划,状态转移考虑单字符和双字符两种解码方式,并处理前导零等边界情况。时间复杂度O(n),空间复杂度可优化至O(1)。示例展示了不同字符串的解码过程,如"226"有3种解码方式,而"06"因前导零无法解码。
2025-10-28 22:38:32
1074
原创 【LeetCode】90. 子集 II
题目要求返回包含重复元素的整数数组的所有可能子集,且解集中不能有重复子集。解题关键在于回溯算法结合去重策略:先对数组排序使相同元素相邻,然后在回溯过程中跳过重复元素。时间复杂度为O(2^n),空间复杂度为O(n)。最优解法是回溯+去重,通过排序预处理和剪枝优化来避免生成重复子集。典型示例如输入[1,2,2]应输出[[],[1],[1,2],[1,2,2],[2],[2,2]]。
2025-10-28 22:26:41
997
原创 【LeetCode】89. 格雷编码
本文介绍了n位格雷码的生成问题。格雷码要求相邻整数二进制表示仅一位不同,首尾也需满足这一条件。关键解法包括对称反射法和位运算公式法,时间复杂度均为O(2^n)。对称反射法通过递归构造n-1位格雷码并镜像反射,添加最高位实现;位运算公式则利用i^(i>>1)快速生成。文章详细分析了算法流程、复杂度、边界条件及常见错误,并提供了多种实现方式(递归/迭代)。典型示例展示了n=1时返回[0,1],n=2时返回[0,1,3,2]等有效序列。
2025-10-27 22:45:01
1206
原创 【LeetCode】88. 合并两个有序数组
摘要 合并两个有序数组问题要求将nums2合并到nums1中,并保持非递减顺序。最优解法采用双指针逆序遍历策略:初始化三个指针分别指向nums1、nums2的有效元素末尾和合并后的末尾位置;从后往前比较元素,较大者放入nums1末尾;最终处理剩余元素。该方法时间复杂度O(m+n),空间复杂度O(1),完美满足原地合并需求。关键点在于逆序处理避免元素覆盖,并妥善处理边界条件和剩余元素。相比正序遍历需要额外空间或排序算法效率低的问题,这种解法在时间和空间复杂度上均为最优。
2025-10-27 22:37:08
588
原创 【LeetCode】87. 扰乱字符串
摘要 本文探讨了判断字符串是否为扰乱字符串的问题。扰乱字符串是通过递归分割和交换操作生成的,要求判断给定字符串s2是否可由s1通过该算法得到。核心解法采用动态规划,定义三维状态dp[i][j][k]表示子串匹配状态,时间复杂度O(n^4),空间复杂度O(n^3)。文章详细分析了算法思路、关键难点和优化技巧,并对比了递归、记忆化等不同解法。典型示例展示了字符串分割与交换的转换过程,帮助理解扰乱字符串的生成机制。
2025-10-22 22:02:25
733
原创 【LeetCode】86. 分隔链表
这篇题解介绍了如何将链表按给定值x进行分隔,要求小于x的节点出现在大于等于x的节点之前,并保持相对位置。主要采用双链表法,通过创建两个虚拟链表分别存储两个分区,最后连接两个分区。该方法时间复杂度O(n),空间复杂度O(1),是最优解法。文章还分析了其他解法(数组法、递归法)的优缺点,并提供了详细的算法流程图和代码实现。关键点在于使用双指针维护两个分区,确保相对位置不变。
2025-10-22 21:54:19
350
原创 【LeetCode】83. 删除排序链表中的重复元素
本文介绍了如何删除已排序链表中的重复元素,使每个元素只出现一次。主要采用双指针算法,时间复杂度O(n),空间复杂度O(1)。关键点在于使用快慢指针遍历链表,检测并跳过重复节点,保留第一个重复元素。文章详细分析了算法流程、复杂度、优化技巧和边界情况,并提供了多种解法对比。通过测试用例和常见错误示例,帮助读者理解并避免常见陷阱。最终返回去重后的有序链表。
2025-10-21 21:51:41
474
1
原创 【LeetCode】82. 删除排序链表中的重复元素 II
题目要求删除已排序链表中所有重复节点,只保留不重复的节点。采用双指针法,通过创建虚拟头节点简化边界处理。算法使用prev指针记录前一个不重复节点,curr指针遍历链表,当发现重复节点时直接跳过所有重复值。时间复杂度O(n),空间复杂度O(1)。关键点在于正确处理连续重复元素和链表指针的更新,需注意处理头部重复、全部重复等边界情况。
2025-10-21 21:50:29
463
原创 【LeetCode】81. 搜索旋转排序数组 II
搜索旋转排序数组 II:在包含重复元素的旋转排序数组中搜索目标值。该问题需要在O(n)时间内判断目标值是否存在,使用二分查找结合重复元素处理策略。当遇到nums[left]==nums[mid]==nums[right]时收缩边界,否则判断有序部分并在其中搜索。最坏情况下时间复杂度为O(n),但平均为O(log n),空间复杂度O(1)。关键点在于处理重复元素对二分查找的影响,确保算法正确性。
2025-10-19 14:42:20
401
原创 【LeetCode】80. 删除有序数组中的重复项 II
这篇文章介绍了一个有序数组去重的问题,要求每个元素最多保留两次。文章详细分析了问题本质,提出了双指针算法作为最优解,时间复杂度O(n),空间复杂度O(1)。通过示例说明了算法处理过程,对比了不同方法的优劣,并给出了Go语言实现代码。关键点在于使用快慢指针和计数变量来高效完成原地修改,同时保持数组有序性。
2025-10-19 14:40:52
782
LFS-BOOK-9.0 构建自己的Linux系统
2019-11-28
机器学习个人笔记完整版v5.4.docx
2020-05-18
PyQt-经典小游戏俄罗斯方块
2024-03-04
Python-100-Days
2019-07-15
C/C++学生成绩管理系统
2021-12-24
Learning WebRTC配套代码.zip
2019-06-25
基于Linux下数字签名技术的实现.pdf
2020-02-03
Python-100-Days.tar.gz(更新,完整版)
2019-11-27
Python编程无师自通-专业程序员的养成.zip
2019-04-30
PYTHON 网络爬虫实战
2019-07-09
微信小程序:开发入门及案例详解.zip
2019-07-04
Linux Bash编程与脚本应用实战
2019-04-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅