- 博客(253)
- 收藏
- 关注
原创 华为笔试编程
这里用到了滑动窗口来取窗口中的最大值,滑动窗口中维护的是dp[i];在前k个部分:是填充窗口的部分(可能填满可能填不满,只维护窗口内可能称为最大dp的dp[i]);从起点score[0]开始,每次最大的步长为k,请你返回小明跳到终点 score[n-1] 时,能得到的最大得分。3/对于每个格子i;可以调1/2/3/k补到达该格子,因此便利所有可能的步数,并更新dp[i]为最大值;每个格子上有特定的分数 score = [1, -1, -6, 7, -17, 7],1/dp[i]为跳到第i个格子的最大得分;
2024-09-27 13:58:25 393
原创 输入输出学习
你可以结合使用 stringstream 来处理多个单词。使用 cout 可以输出数据,支持多种数据类型。可以使用 printf 或 来格式化输出。
2024-09-27 10:13:44 167
原创 输入输出的常用函数
用法:FILE *fopen(const char *filename, const char *mode);用法:int fscanf(FILE *stream, const char *format, …用法:char *fgets(char *str, int n, FILE *stream);用法:int fputs(const char *str, FILE *stream);返回值:成功时返回成功读取的项数,失败时返回 EOF。返回值:成功时返回 str,失败时返回 NULL。
2024-09-26 11:30:48 282
原创 高并发内存池
https://blog.csdn.net/chenlong_cxy/article/details/122819562# 如何实现定长。
2024-09-25 11:44:17 825
原创 哈夫曼树的带权路径长度
STL中提供的priority_queue默认是大顶堆,可以通过自己重载运算符来实现小顶堆的优先队列先建哈夫曼树,再累加求和;10000521HTNode结构体:定义了每个结点的属性,包括权重、父节点、左孩子、右孩子、select函数:从当前树中选择两个权重最小且没有父节点的节点,用于接下来的合并操作;s1和s2分别记录两个权重最小节点的索引;这是通过线性遍历来实现的,双遍历设计:第一次找出最小节点s1,第二次找出第二个最小节点s2;通过parent=0来确保只选择未被合并的节点;
2024-09-25 11:03:17 821
原创 内存池设计2
问题产生通常我们在编写程序的时候回使用 new delete 这些关键字来向操作系统申请内存,而这样造成的后果就是每次申请内存和释放内存的时候,都需要和操作系统的系统调用打交道,从堆中分配所需的内存。如果这样的操作太过频繁,就会找成大量的内存碎片进而降低内存的分配性能,甚至出现内存分配失败的情况。问题解决方案而内存池就是为了解决这个问题而产生的一种技术。
2024-09-24 22:05:49 602
原创 内存池设计1
(Memory Pool)是一种内存分配方式,又被称为固定大小区块规划(fixed-size-blocks allocation)。通常我们习惯直接使用new、malloc等API申请分配内存,但是这种方式非常容易产生内存碎片,早晚都会申请内存失败。并且在比较复杂的代码或者继承的屎山中,非常容易出现内存泄漏。
2024-09-24 21:11:58 636
原创 9-24笔试
用于定义静态存储期的变量,限制变量的作用域,创建共享的类成员,以及支持静态函数和静态库的构建。其主要作用是管理变量的生命周期和作用域,提高程序的封装性和模块化。
2024-09-24 19:45:23 128
原创 9-24刷题
1、不放dp[i][j]: dp[i][j] = dp[i-1][j];或者 dp[i][j] = dp[i-1][j-A[i]] + A[i];给定一个正整数 s 和 n 个正整数 , 求有多少种组合的和为 s?数值相同的两个数视为不同的两个数。1、dp[i][j]:代表从前i个物品中选择一些物品,使得他们的价值和恰好为j的选取的总数;2、初始化:dp[0][0] = 1;第一行两个整数 n,s,含义如题所述;第二行 n 个整数。
2024-09-24 10:17:02 241
原创 9-23八股
return 0;内联函数通过将函数调用展开为直接代码,可以减少函数调用的开销,适合用于小而频繁调用的函数。避免在复杂函数、递归函数、虚函数中使用内联,以避免代码膨胀和编译器优化失败。内联函数比宏更安全,具有类型检查和作用域限制,是宏的良好替代品一个事务中读取了另一个未提交事务所修改的数据,
2024-09-23 22:44:46 669
原创 9-23C++函数用法
在C++中,将数据从一个对象到另一个对象的流动抽象为“流”。流在使用前要被创建,使用后要被删除。数据的输入与输出是通过 I/O 流实现的,cin 和 cout 是c++预定义的流类对象。https://blog.csdn.net/weixin_45031801/article/details/136921743(非常好的博主)stringstream 是 C++ 提供的专门用于处理字符串的 输入输出 流类。
2024-09-23 19:42:31 406
原创 9-23八股
我们知道在C++中成员变量和成员函数是分开存储的,每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码。那么问题是:这一块代码是如何区分哪个对象调用自己的呢?C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象this指针是隐含每一个非静态成员函数内的一种指针,this指针不需要定义,直接使用即可。当形参和成员变量同名时,可用this指针来区分在类的非静态成员函数中返回对象本身,可使用return *this。
2024-09-23 14:59:29 956
原创 京东笔试后端
● 第三道:牛牛从树及其子树中吃糖果,每次先从树中移除颜色数量最多的结点,然后吃剩下的糖果,然后吃下的糖果异或和的最大值。思路:用二叉树的后序遍历,先将当前结点颜色加入treemap,然后从treemap中移除颜色最多的,最后对所有剩下的颜色求异或和。思路:这是就简单判断了一下位置小于但是速度大于的时候会移除,想着第三道过了再看的,但是第三道死活0%● 第一道,给你一个数组和k,若数组中连续的数的和超过了k,就对其进行分组,求最少的分组个数。
2024-09-23 08:56:27 277
原创 拼多多笔试
请帮我找到一个最省钱的吃汉堡计划,在未来N天每天吃一个汉堡的情况下,最少要花多少钱;输出:对于每组测试数据,分别输出一个整数,代表有多少组数字是的删除这两个数字后剩余n-2个整数的平均值等于原数组a中n个整数的平均值;我想知道,对于给定的N个单词的多多词典,按照新的排序方式的前M个单词分别是什么?给字典中的单词排序,单词都是有大写字母A-Z组成,一般的字典是按照字典序进行排序,但是我想用一种新的比较方式来进行排序,2.同为包含“PDD”的单词,以及不包含“PDD”的单词之中,则还是按照字典序小的排在前面,
2024-09-22 21:14:38 903
原创 9-20 笔试题
1、dp用来记录箱子是否能够选取玩具来装满某个容量的空间;选取玩具后,再检查填充物能补足剩余空间;在原序列中相对位置比它靠前的,也就是比它先入栈的,出栈顺序必须是逆序;在原序列中相对位置比它大的,也就是比它后入栈的,出栈顺序没有要求;以上两点可以间插进行。
2024-09-21 15:39:31 350
原创 C++八股 9-20
空指针调用成员函数,会分一下几种情况:如果调用编译器确定函数(普通成员函数、静态成员函数),该成员函数中需要对this指针指向的内容进行读取或者修改,出错;反之无错;如果调用运行期确定函数(使用多态的虚函数),出错。1、Lambda 表达式的原理是通过生成一个匿名类来实现,编译器将 lambda 转换为一个类,捕获的变量变成类的成员,operator() 被重载用于调用函数逻辑。根据捕获的方式(按值或按引用),编译器会生成不同的匿名类。
2024-09-20 17:02:59 1004
原创 小米笔试题汇总
为能尽快吃到这两种面包,小A可以选择两个不同的面包机x,y同时工作,并分别制作a,b两种面包,花费的时间将是。给一个长度为n的序列和一个整数x,每次操作可以选择序列中的一个元素,将其从序列中删去,或者将其值加一。为能尽快吃到面包,请你帮小A计算一下,至少需要花费多少时间才能完成这两种面包的制作。当然,小A也可以选择其中一个面包机x制作a,b两种面包,花费的时间将是ax+bx。解释:可能的一种操作为,删去最后一个元素,再使第一个元素加一,得到的序列为2 3。第二行n个正整数ai,表示面包机制作面包a的时间。
2024-09-19 15:19:59 505
原创 代码随想录图论
dfs是可一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了,再换方向(换方向的过程就涉及到了回溯)。bfs是先把本节点所连接的所有节点遍历一遍,走到下一个节点的时候,再把连接节点的所有节点遍历一遍,搜索方向更像是广度,四面八方的搜索过程。
2024-09-18 22:17:02 908
原创 第二天__
因为Snapshot是kvDB生成的,kvDB肯定不知道raft的存在,而什么term、什么日志Index都是raft才有的概念,因此snapshot中肯定没有term和index信息。m_lastSnapshotIncludeTerm :快照的信息,快照最新包含哪个日志Term,与m_lastSnapshotIncludeIndex 是对应的。因此仓库实现目前采用的是使用boost库中的持久化实现,将需要持久化的数据序列化转成std::string 类型再写入磁盘。raft节点的部分信息。
2024-09-18 10:47:17 380
原创 【无标题】
1、带virtual关键字函数的类及其子类,在编译过程生成他们的虚函数表;2、在运行时,根据指针或引用指向的实际对象,从虚函数表中选择函数调用;静态多态:函数重载、模版 在编译期确定;
2024-09-14 11:15:48 146
原创 第一天--
在当今大规模分布式系统的背景下,需要可靠、高可用性的分布式数据存储系统。传统的集中式数据库在面对大规模数据和高并发访问时可能面临单点故障和性能瓶颈的问题。为了解决这些问题,本项目致力于构建一种基于Raft一致性算法的分布式键值存储数据库,以确保数据的一致性、可用性和分区容错性。在一个分布式系统中,多个服务器(或节点)通常共享相同的资源或数据状态。共识协议的目标就是确保这些节点在面对不可靠的网络环境或节点故障时,依然能够就系统的某个状态或值达成一致,即共识。对于本项目中的分布式键值存储系统。
2024-09-11 11:48:57 839
原创 项目背景与介绍
共识是容错分布式系统中的一个基本问题。**共识涉及多个服务器对状态机状态(对本项目而言就是上层的k-v数据库)达成一致。**一旦他们对状态机状态做出决定,这个决定就是最终决定(已经被集群共识的值可以保证后面不会被覆盖,Raft的安全性)。典型的一致性算法在其大部分服务器可用时保持运行;例如,即使有2台服务器出现故障,5台服务器的集群也可以继续运行。如果更多的服务器出现故障,它们将停止对外提供服务(但永远不会返回不正确的结果)。
2024-09-09 17:40:49 862
原创 字典树基础
字典树,是一种 空间换时间 的数据结构,又称Trie树、前缀树,是一种树形结构(字典树是一种数据结构),典型用于统计、排序、和保存大量字符串。所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的 字符串比较 ,查询效率比哈希树高。
2024-09-08 21:04:34 596
原创 手搓线程池
我们在用户态通过系统调用到内核态,而在这个系统调用的过程中,涉及到用户态到内核态的切换,就要保存运行线程的现场,这是一个耗时的操作,第二,从内核态需要等待操作系统将资源准备就绪,再返回给用户态,这也是一个耗时的操作,一个监听线程用来监听客户端请求,当存在多个客户端同时进行连接时,当这些请求比较耗时的时候,为了不阻塞监听线程,就将每个客户端连接放到一个新的工作线程中,1、生产者线程:并不一定是线程池的构成部分,可能是业务的核心线程(监听线程),也可能是线程池中的构成部分,这是生产任务的线程;
2024-09-06 23:31:29 868
原创 深信服笔试
https://blog.csdn.net/Wang_Dou_Dou_/article/details/120332613*printf(“%c”, p + 4); 这一行代码表示:*p 取出指针 p 所指向的字符,即 c[0],也就是字符 ‘a’。‘a’ 的 ASCII 码是 97,*p + 4 就是 97 + 4 = 101。101 对应的字符是 ‘e’。printf(“%c”, *(p + 4)); 这一行代码的含义是:p + 4 代表指针 p 向前移动 4 个位置,也就是指向 c[4],
2024-09-04 15:33:33 121
原创 深信服C++笔试
这种方法是处理了一次AAA之后,会将慢指针回退两个位置,然后再从慢指针处检查是否有三个及以上相同的;快指针每次都在慢指针相同位置往前查;判断慢指针和快指针之间是否有三个及三个以上的相同字符;有的话删除,回退慢指针;没有的话,慢指针向前移动;双指针法:https://blog.csdn.net/u013322907/article/details/38559281。下面这种方法,和上面的方法类似,但没有上面的方法效率高,因为它每次删除之后,都将慢指针移动到字符串开头;然后重新开始去遍历;
2024-09-03 22:24:41 220
原创 webserver知识点
Linux的定时机制(方法):socket选项SO_RCVTIMEO和SO_SNDTIMEOSIGALRM信号I/O复用系统调用的超时参数(本文将介绍如何使用SIGALRM信号处理非活动连接)。
2024-09-02 21:52:14 959
原创 C++STL sort
所有的sort算法的参数都需要输入一个范围,[begin, end)。这里使用的迭代器(iterator)都需是随机迭代器(RadomAccessIterator), 也就是说可以随机访问的迭代器,如:it+n什么的。(partition 和stable_partition 除外)如果你需要自己定义比较函数,你可以把你定义好的仿函数(functor)作为参数传入。每种算法都支持传入比较函数。
2024-09-02 14:02:15 960
原创 C++STL list实现原理
list是一个双向链表容器,它可以在其内部存储各种类型的元素,并且支持动态地添加、删除和修改元素。list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。
2024-09-01 23:24:12 954
原创 zookeeper学习
zookeeper为什么是全局数据一致呢?不是说各个服务器注册到zookeeper上,各个服务器有自己的业务功能,客户端访问zookeeper找到他需要的功能,然后返回功能所在服务器IP地址,然后再访问服务器ip获得返回值吗?这里说的客户端其实就是提供服务的服务器,它相对于zookeeper服务器来说是客户端;
2024-08-30 20:17:49 214
原创 epoll
https://blog.csdn.net/m0_60259116/article/details/134332371https://blog.csdn.net/daocaokafei/article/details/117397600
2024-08-29 21:07:12 102
原创 TCP协议和UDP协议-8.28
HTTP协议和HTTPs协议属于应用层,按照TCP/IP模型,讲解传输层,传输层分为TCP协议和UDP协议。端口号(Port)标识了一个主机上进行通信的不同的应用程序(进程)。利用ip地址+端口号可以定位全球上唯一一个进程。ip决定的是服务器主机位置,端口号决定的是哪一个应用处理程序。可以使用netstat -nltp命令查看协议号、源ip端口和目标ip端口;通过这五个数字可以识别一个通信。端口号范围划分:0-1023:知名端口号,服务于HTTP、FTP这些广为人知的应用层协议,
2024-08-28 17:57:00 305
原创 HTTP协议和HTTPS协议
以下参考:https://blog.csdn.net/weixin_51367845/article/details/123313047。
2024-08-28 11:53:01 1896
原创 我的项目准备
线程的关键是线程的工作函数run;这个函数不断while循环知道被条件变量唤醒然后上锁从list头取出任务,开始执行任务;通过append函数将新任务添加到任务队列的尾部,然后所有线程抢任务队里中的资源;抢到的线程对任务队列进行加锁取出任务结构体,任务结构体存在回调函数,就是工作函数;线程池数组:在线程池构造的时候就创建一定个数的线程放在数组中,并进行分离;线程池数组和请求队列。
2024-08-27 22:39:51 160
原创 TinyWebServer代码详细讲解(threadpool模块)
程序采用c++编写,要自己封装一个简易的线程池类。大致思路是创建固定数目的线程(如跟核数相同),然后类内部维护一个生产者—消费者队列。提供相应的添加任务(生产者)和执行任务接口(消费者)。按照操作系统书中典型的生产者—消费者模型维护增减队列任务(使用mutex和semaphore)。mutex用于互斥,保证任意时刻只有一个线程读写队列,semaphore用于同步,保证执行顺序(队列为空时不要读,队列满了不要写)。
2024-08-27 22:39:10 914
原创 经纬恒润C++面经
安全序列是指一个进程序列{P1,…在满足当前的进程X的资源申请之前,判断一下,是否还能有足够的资源去满足 下一个 距最大资源需求最近 的进程,若可以满足,则继续检查下一个 距最大资源需求最近 的进程,若均能满足所有进程,则表示为安全,可以允许给当前进程X分配其所需的资源申请,否则让该进程X进行等待。(防止两个指针指向同一块资源,导致资源的二次释放,程序崩溃)注:检查是否安全的过程中,每满足了一个进程,则进行下个检查时,当前可用资源为回收上一个进程资源的总值,每满足一个进程表示此进程已结束,资源可回收。
2024-08-27 22:11:36 889
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人