- 博客(32)
- 收藏
- 关注
原创 Leetcode105-前序中序来构造二叉树-Python-分解问题的思路
本文讲解了Leetcode-105题,从二叉树的前序和中序遍历结果去构造二叉树的思路
2026-01-09 20:06:12
458
1
原创 Go 语言之旅方法(Methods)与接口(Interfaces)完全指南
本文整理自 Go 官方互动教程 “A Tour of Go” 中的 Methods / Interface 模块
2025-12-26 09:02:26
382
1
原创 Go中的指针、结构体、切片、字典
欢迎回到 Go 语言之旅!在掌握了基础语法后,我们将进入 Go 语言最核心的“数据及其操作”部分。这一章节涵盖了指针、结构体、数组、切片以及映射。
2025-12-25 09:38:15
587
原创 Go函数闭包实战-复用函数
在构建 Web 应用时,我们经常会发现自己在不同的处理函数(Handler)中编写相同的逻辑。比如,验证请求路径、提取参数、处理错误等。在之前的代码中,我们的 、 和 都必须在开头调用 来获取页面标题并进行错误检查。这种重复代码不仅显得臃肿,而且一旦验证逻辑发生变化,我们需要修改所有的地方。那么,如果我们能把这些通用的验证逻辑“包装”起来,只写一次,该多好?Go 语言的 函数字面量 (Function Literals) 和 闭包 (Closures) 正是解决这个问题的利器。在优化代码结构之前,我们先
2025-12-22 11:23:48
442
原创 Leetcode-3780-Python
这道题是典型的“模运算”应用。以后遇到“整除”、“倍数”之类的问题,别急着把数字加起来,先想想余数能不能帮你把问题简化。把复杂问题拆解成几个小桶,分别处理,最后合并结果,这大概就是算法题带给我们解决问题的思路吧。
2025-12-21 18:35:22
876
原创 一文搞懂 Linux 进程:虚拟地址空间、进程终止与程序替换
在 Linux 中,进程(Process) 是操作系统进行资源分配和调度的基本单位。理解进程,本质上就是理解 “操作系统如何管理内存、程序如何运行以及如何退出”。
2025-12-15 16:28:24
593
原创 【C++并发实战】一行代码引发的Core Dump:深入解析多线程下的“赋值与唤醒”时序陷阱
在异步网络库(如 Muduo)的同步化封装过程中,CountDownLatch 是神器,也是地雷。本文从一段看似人畜无害的回调代码出发,复盘了一次因“唤醒顺序”导致的段错误(Segmentation Fault),并深入探讨了多线程环境下的 Happen-Before 原则与指令执行时序。
2025-12-03 18:23:35
900
原创 Linux-pthread线程库
Tips:任何一个线程调用exit都会导致整个进程退出,若只想让某个线程退出,应该用pthread_exitPthread_t (线程id)是线程库struct tcb属性在地址空间中的地址!这就是为什么要传线程id!thread 声明变量的线程私有的! thread只能修饰内置类型、 底层封装都是2.锁如何实现?背景:线程寄存器私有,内存共享,swap/exchange指令由于只有一条,所以是原子的,将mutex内部的1交换到线程内部寄存器里,好像是他把钥匙拿走了,其他线程进来,只能阻塞等待。三
2025-09-30 12:28:14
659
原创 Linux-文件系统
文件 = 内容 + 属性访问文件,必须先打开它文件打开后,由磁盘加载到内存中,如何管理文件?先描述,在组织调用系统接口write并写入字符串时,要不要考虑'\0'的问题?不需要!系统层面没有'\0'的概念,这是c/c++的概念!在系统层面,进程访问文件的唯一方式是文件描述符,FILE* 一定封装了fd!又加了语言级别的缓冲区一切皆文件,是说给进程的!进程只需要拿着文件描述符,找到struct_file,调用不同的read/write接口完成对文件的读写!中的指针是一个极其重要的“”枢纽。
2025-09-28 20:33:18
257
原创 链表带环问题,解剖快慢指针
至于找入环节点,我们可以这样想:如果知道环的长度或者其整数倍,那么让快指针先走环的长度的距离,在让慢指针从头节点开始和快指针每次走一步,这样他们任何时刻的距离差就是环长,那么当慢指针到达入环的节点时,快指针刚好在环中转了一圈回到入口,这时他们相等,入口就找到了。这时会发现如果链表不带环,则直到快指针走到nullptr,慢指针处于链表中部,他们不会相遇。假设相遇时,慢指针走了k步,则快指针走了2k步,2k-k=k,k是多走的距离,也就是环长的整数倍,就相当于知道了环的长度。
2024-12-08 23:00:03
254
原创 结构体内存对齐,memmove与memcpy的区别
功能是把source位置开始的num个字节的数据拷贝到dest位置,而当这两个地址存在重叠时,memcpy可能达不到想要的效果。3. 结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的。4. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构。体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。2. 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。对⻬数 = 编译器默认的⼀个对⻬数 与 该成员变量⼤⼩的较⼩值。
2024-12-05 23:35:00
409
原创 指针类型的意义
例如,int*的指针解引用得到自int*开始向后四个字节的空间,+1往后跳过四个字节的距离,char*指针解引用得到自char*开始向后1个字节的空间,+1往后跳过1个字节的距离。有了指针,我们就可以通过函数操作我们开的空间,因为函数传参是转值,会新开辟空间,在被调用函数中操作不影响主调函数,如果可以传地址,就可以在空间中为所欲为。数组arr中存放元素个数为n的一维数组,于是arr作为数组首元素的地址,它加a跳过一维数组的大小的a倍的范围,解引用拿到。当然,这段存放其他数据地址的空间也有属于自己的地址。
2024-12-03 21:51:46
377
原创 数组、简单函数
2.当arr被用作sizeiof的运算对象,此时的结果是整个数组的大小,单位是字节(Byte)。3.当用作decltype的参数,以及typeid的运算对象时,不会发生隐式类型转换。一个 除了1和它本身 ,再没有其他因子的数是素数,优化:偶数一定不是素数。的运算对象,此时结果是整个数组的地址,不是首元素地址。1. 当arr被用作。
2024-11-26 21:35:38
116
原创 用哨兵节点简化链表的插入、删除操作
加入哨兵节点后的插入操作:由于链表一定不为空,所以无需判断,只需要逐次遍历链表,找到尾节点,然后把新节点链入尾部。,如果为空,插入节点作为链表头节点返回。不为空,遍历链表至最后一个节点,tail->next=newnode;由于通常是单向链表,所以一般要保存要删除节点的上一个节点(由于头节点没有上一个节点,所以要单独处理),2.判断 要删除的节点 是否是头节点,若是,返回头节点的下一个节点。哨兵节点通常位于链表的头部,它的值没有任何意义。让上一个节点指向要删除节点的下一个节点。需要判断给的链表是否为空。
2024-11-23 10:28:30
238
原创 剑指offer 第九题 乘积小于k的连续子数组个数
主要是因为存在大量的重复计算,比如我们在遍历完区间[a,a+1,...,b]之后,i由a移动到a+1,这时,我们要继续遍历[a+1,b],即product*=j,会发现这个操作在上一次循环已经做过了,这就是问题所在,那么该如何避免重复呢?,所以可以放心的++i,这时product中记录的就是[i+1,j+1 ]的所有数字之积,一直向右移动i,直到product小于k,接着就到。这种思路在脑海里可以抽象成, 一个人在马路上从左往右走,每走一步,就转身回头看看,每走一步,就回头看看......
2024-11-15 23:06:41
231
原创 从O(n)到O(lgn)的经典优化思路
可以对上述思路做调整:当被除数大于除数,则比较被除数是否大于除数的2^1倍,如果是,则继续比较被除数是否大于除数的2^2倍,以此类推,直到被除数最多大于除数的2^k倍,则商累加2^k,被除数减去除数的2^k后,再依次与除数的2^1,2...做比较,重复上述过程,直到被除数小于除数(假设为正数)由于每次将除数翻倍,则时间复杂度为O(lgn)。和1相同,可以通过递归 x*pow(x,n-1)这种思路,由于每次将n减去1,时间复杂度仍然为O(n),而且大家想想,求1的2147483647有多恐怖。
2024-11-01 15:15:40
370
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅