- 博客(140)
- 收藏
- 关注
原创 高并发内存池
本项目实现的是一个高并发的内存池,它的原型是Google的一个开源项目tcmalloc,tcmalloc全称Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,用于替换系统的内存分配相关函数malloc和free。该项目就是把tcmalloc中最核心的框架简化后拿出来,模拟实现出一个mini版的高并发内存池,目的就是学习tcmalloc的精华。该项目主要涉及C/C++、数据结构(链表、哈希桶)、操作系统内存管理、单例模式、多线程、互斥锁等方面的技术。
2024-08-31 16:46:45
931
原创 【优先级队列】Leetcode 最后一块石头的重量
根据题目的意思,为了寻找到本次数组中的最大的两个值,我们需要使用一个数据结构:堆,使用大堆,每一次出两个数据,这两个数据就是当前数组中的两个最大值,之后在按照题目的意思进行模拟即可
2024-05-13 15:12:08
551
原创 【二叉树】Leetcode 在每个树行中找最大值
这道题的重点在于怎么能够保存这一层的节点,并求出层节点的最大值:我们需要使用一个queue,每一次出队列的时候将当前队头结点的左右子树入队列(这里就是将下一层的结点入队),并判断每一次出队列结点的值是否是最大的(每一次出队列的节点就是当前层的节点)
2024-05-13 14:44:50
342
1
原创 【二叉树】Leetcode 二叉树的锯齿形层序遍历
这道题其实是和N叉树层序遍历是一样的,只不过是要求每一次的遍历的方向不一样;注意:这一次的使用的队列不能够是queue了,因为需要从后往前遍历容器,所以就可以使用vector作为队列
2024-05-11 11:19:36
411
原创 【二叉树】Leetcode N 叉树的层序遍历
在做层序遍历的时候由于它的每一个结点是有val + vector child组成,所以在做层序遍历的时候需要考虑它每一层结点的个数,那我们就可以使用一个queue保存每一层的结点;那么我们在做第一层的时候,这样很简单,第一层用完怎么做呢?我们在准备第二层结点的时候,就需要将第一层结点提取出来,然后将第一层节点pop出去,现在的时候,第一层的vector ret已经出现的,但是我们queue还是没有处理的,所以在添加当前节点的val之后就需要遍历结点的child vector,将它的下一层结点放到queue中
2024-05-11 10:41:11
375
原创 【栈】Leetcode 字符串解码
这道题有四种情况:1.遍历的时候遇到数字,我们计算并保存数字,将它加入到数字栈中;2.遍历的时候遇到[,我们就把字符保存,加入到字符栈中;3.当遇到],我们及时按照数字栈的栈顶元素的数字,添加字符栈中栈顶元素的次数;4.如果当前遍历的时候上述情况什么都不是,说明是正常的字符串,直接在字符栈的栈顶中添加即可
2024-05-10 15:26:55
388
原创 【栈】Leetcode 验证栈序列
在这里就只需要模拟一下这个栈的出栈顺序即可:使用一个stack,每次让pushed里面的元素入栈,如果当前栈顶的元素等于poped容器中的当前元素,因此就需要让栈顶元素出栈,poped的遍历位置往后移动一位
2024-05-10 14:43:30
293
原创 【项目】Boost搜索引擎
现在市面上出现很多搜索引擎,比如:百度、Google、Bing等等,它们都是全网性搜索而我做得项目就像cplusplus网站中搜索C++的相关知识一样,同样做的是站内搜索,它的搜索更垂直。
2024-05-08 16:18:45
1388
1
原创 【栈】Leetcode 比较含退格的字符串
使用栈模拟,但遇到#字符就让栈顶元素出栈,但是在写的过程中有两点需要注意:当#出现在第一个位置,需要特殊处理一下;当栈为空的时候,还出现#字符需要特殊处理一下。
2024-05-07 09:04:24
299
原创 【栈】Leetcode 1047. 删除字符串中的所有相邻重复项
使用栈这个数据结构,每一次入栈的时候观察此时的字符和当前栈顶字符是否相等,如相等:栈顶出栈;
2024-05-07 08:44:58
387
原创 【字符串】Leetcode 二进制求和
注意:循环遍历字符串的时候,循环的边界不能够是>=0,因为需要向前处理进位,当i ==0的时候,i - 1就越界了,所以等循环完成需要单独判断第一个位置的字符情况,需要进位的就尾插字符串即可。
2024-05-06 19:40:14
414
原创 【字符串】Leetcode 最长回文子串
i==j说明一个字符肯定是回文i+1 == j也说明一个字符是回文i+1 < j说明需要判断[i+1, j-1]这一段区间是否是回文此时我们就可以明白s[i] == s[j]它仅仅判断的是左右两个端点
2024-05-05 10:52:25
458
原创 【哈希表】Leetcode 14. 最长公共前缀
我们使用当前第一个字符串中的与后面的字符串作比较,如果第一个字符串中的字符没有出现在后面的字符串中,我们就直接返回;反之当容器中的所有字符串都遍历完成,说明所有的字符串都在该位置出现了当前字符,所以遍历完成之后就像ret中添加当前的字符
2024-05-05 09:57:41
441
原创 【哈希】Leetcode 217. 存在重复元素
使用set集合完成元素的存储,当我们将当前元素插入到集合单中,如果insert的返回值的pair.second等于false说明当前元素已经存在,反之元素在集合中存在
2024-04-29 15:45:54
247
原创 【哈希】Leetcode 面试题 01.02. 判定是否互为字符重排
直观的想法:我们找到一个字符串的全排列,然后对比当前的排列是否等于另一个字符串。如果两个字符串如果互为排列,所以我们知道两个字符串对应的字符出现的个数相同,那么就可以排列成另一个字符串
2024-04-28 15:22:17
420
原创 【哈希】Leetcode 两数之和
我们希望让这个数组有序,然后再寻找的时候可以很快的找到是否存在这个target - nums[i],这里需要返回的是下标,所以需要一个数据结构保存key:nums AND val:index,因此我们想到了哈希表
2024-04-28 15:15:43
516
原创 【链表】Leetcode K个一组翻转链表
翻转n个链表我们使用头插法,注意:当第一组链表翻转完成之后,我们就不能在使用上一次的头插法的头结点了,就需要在新的链表的尾结点使用头插法,所以我们每一次在翻转当前组链表的时候需要记录翻转完成之后的尾结点,这个尾结点特别好找,就是当前链表组的首节点,使用prev变量记录下来就行。
2024-04-26 20:41:39
505
原创 【链表】Leetcode 合并k个升序链表
注意:遍历一次vector后现在的队列里面全保存的当前的首节点,所以我们之后不在需要遍历vector了,因为取出当前的top之后,我们让当前top节点的之后向后移动一位,然后再push到堆里,只有当堆为空的时候才是所有的链表都遍历完成的时候。
2024-04-26 20:09:50
445
原创 【链表】Leetcode 两数相加
我们这里设置一个头结点,然后遍历两个链表,使用一个flag记录相加的结果和进位,如果两个链表没有走到最后或者进位不等于0,我们就继续遍历处理进位;如果当前的链表都遍历完成了,判断当前的进位是否>10,然后处理是否需要添加进位结点
2024-04-22 20:39:22
426
原创 【归并】Leetcode 交易逆序对的总数
还是使用分治算法的思想:我们可以先将数组分成两块,先求出左边部分的逆序对,右边部分的逆序对和一左一右的逆序对,三个数量相加就是当前数组中的所有逆序对;其次我们在求子数组逆序对的时候,可以把排序添加上,如果添加上排序,那么求左右部分的逆序对的时候就会很方便,只需要将下标相减即可
2024-04-21 09:34:08
428
原创 【归并】Leetcode 排序数组
使用归并算法排序数组,我们先在数组中寻找一个mid点,然后把数组分成了两部分,我们先排左部分,排左边部分的时候有需要将当前的子数组分成两部分,继续循环,直到当前子数组的长度为1的时候,我们直接返回,排右边部分;将排好的左右部分进行有序数组的合并,合并完成之后将子数组填充到当时一段区间中的原数组当中去
2024-04-21 09:04:03
574
原创 【分治】Leetcode 数组中的第K个最大元素
堆排序:1. 寻找最后一个节点的父亲,依次向上遍历,完成小堆的建立;2. 从最后一个元素开始,和堆顶的数据做交换,此时最小的数据在对后面,然后对剩下的区间重新完善小堆
2024-04-19 16:23:43
895
原创 【分治】Leetcode 排序数组
我们这里使用三指针,将数组分成三块:key,如果当前指针指向的数字key,就让swap(nums[--right], nums[i])。然后继续对key的区间进行排序
2024-04-18 20:31:09
241
原创 【分治】Leetcode 颜色分类
如果当前的nums[i] == 0,我们就让nums[++left] 和 nums[i++]位置上的数字做交换,这里的i是可以向前移动的,因为++left位置上的数字一定是1。如果nums[i] == 2, swap(nums[–right], nums[i])如果当前的nums[i] == 1,i++即可。
2024-04-18 17:28:38
411
原创 【位运算】Leetcode 消失的两个数字
我们将这两个数组异或在一起,最后的结果就是a ^ b(缺失的两个数字)的结果,这两个缺失的数字一定是不相同的,所以我们就寻找他们第一个比特位是1的那个位置,异或的原理是:相同为0, 不同为1,按照这个位置将数组划分成两部分,一部分是这一位上是1的,另一部分是这一位上是0的,然后将两个数组的两个部分异或在一起,就得到缺失的两个数字。
2024-04-15 22:26:18
621
原创 【位运算】Leetcode 只出现一次的数字 ||
nums中要么一个数字出现三次,一个数字出现一次,按照比特位来说只可能出现上面的四种情况: 3n个0 + 0 或者 3n个0 + 1 或者 3n个1 + 0 或者 3n个1 + 1,它们相加的结果依次是0, 1, 3n, 3n+1,让当前这个比特位相加的结果%3可以的看出结果和只出现一次的数字上面的比特位一样
2024-04-14 11:40:58
244
原创 【位运算】Leetcode 两整数之和
异或的本质就是无进位相加,但是我们需要处理进位,就需要知道哪一位上有进位,再让无进位相加的结果 + 进位即可,在重复这个过程,当进位等于0的时候,说明相加的过程已经结束
2024-04-14 11:11:20
188
原创 【位运算】Leetcode 丢失的数字
按照上面的代码,比如当前在[0,4]区间中寻找确实的数字,首先将ret = 0 ^ 1 ^ 2 ^ 3 ^ 4;之后,再让ret = ret ^ 0 ^ 1 ^ 3 ^ 4;得到ret = 2;
2024-04-13 10:56:48
288
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人