- 博客(77)
- 收藏
- 关注
原创 【盒马】20250412笔试算法题
接下来我们计算当选中白色位置的时候期望如何算,具体思路是,当选中一个W位置(i,j)时,我们就需要看看以(i,j)为基点,当把该位置染成红色之后,上下左右四个方向可以把几个连通块合成一个连通块。我们可以看上下左右四个放下的arr中存的值放到一个set里,set是会去重的,所以最后set里面有几个元素,就说明有几个连通块被合成了一个连通块,本题比较简单,就是输入俩字符串,s和t,保证这俩字符串的字符个数都是偶数,然后把t的后半部分拼接到s后面,然后把s和t的前半部分输出即可。
2025-04-17 11:30:52
727
原创 C++笔试强训18、19、20
如果在父类构造函数中调用虚函数,由于调用构造函数的顺序是先调用父类的构造函数再调用子类的构造函数,所以这个时候子类还没初始化呢,如果形成多态会发生一些未定义的错误,所以就只能调用父类的虚函数,所以不会发生多态。然后调用子类的构造函数,子类构造函数中调用了父类成员函数test,test中调用会使用父类的this指针调用func函数,会发生多态,因为父类this指针指向的是子类对象,所以会调用子类的成员函数func,会。C/D:map、set底层都是红黑树,每个节点之间不是连续的,节点之间是通过指针相连的。
2025-04-14 16:54:19
714
原创 【腾讯云智】20250329笔试算法题
main函数中二维数组直接遍历,如果该位置不为0即有僵尸,且vis[i][j]=false代表没被遍历过,那就直接把vis[i][j]=true,然后tmp=arr[i][j]表示这一个范围tmp即僵尸的初始数量然后++cnt,表示块数+1,然后调用dfs即可。我们可以找打一个最小的数a=3满足6<=2*3<=9,如果a变成2就不满足了,所以最小就是3,然后可以找到一个最大的数b=4满足6<=2*4<=9,如果b=5的话就不满足了,所以b最大只能是4,所以最后输出3 4。
2025-04-13 13:51:56
1007
原创 C++从零实现Json-Rpc框架
RPC(Remote Procedure Call)远程过程调用,是⼀种通过网络从远程计算机上请求服务,而不需要了解底层网络通信细节。RPC可以使用多种网络协议进行通信, 如HTTP、TCP、UDP等, 并且在TCP/IP网络四层模型中跨越了传输层和应用层。简言之RPC就是像调用本地方法一样调用远程方法。过程可以理解为业务处理、计算任务,更直白的说,就是程序/方法/函数等,就是像调用本地方法一样调用远程方法。具体原理不多做解释,简单来说就是客户端A需要运行函数func,得到结果,但是这个函数不在客户端这里,
2025-03-11 17:48:09
1137
原创 C++ map、set、multimap、multiset的介绍和使用
set文档set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。set在底层是用二叉搜索树(红黑树)实现的。
2025-03-08 10:39:21
574
原创 C++特殊类的设计
在加锁区域内,再次进行判空检查(第二次检查),这是为了确保在第一个线程进入加锁区域后,如果有其他线程也尝试进入,它们会在第一次检查失败后被阻塞,直到第一个线程完成单例对象的创建并解锁。将该类的构造函数设置为私有即可,因为子类的构造函数被调用时,必须调用父类的构造函数初始化父类的那一部分成员,但父类的私有成员在子类当中是不可见的,所以在创建子类对象时子类无法调用父类的构造函数对父类的成员进行初始化,因此该类被继承后子类无法创建出对象。然而,这种方法虽然简单有效,但在单例对象已经创建之后,每次调用。
2025-02-27 19:50:15
916
原创 C++ bitset(位图)的模拟实现
判断方式比较简单,每一个整数的所有比特位,只要有一个为1,那该整数就肯定不等于0,所以,我们可以遍历所有整数,只要有一个整数不等于0,那就说明有1,返回true,否则所有整数都是0,没一个1,返回false。需要注意的是,如果位图没有包含最后一个整数的全部比特位,那么最后一个整数的二进制无论如何都不会为全1,所以在判断最后一个整数时应该只判断位图所包含的比特位。例如,假如我们要建立一个50个比特位的位图,就需要两个int大小,共64个比特位,使用前50个比特位,后14个舍弃不用就好。的大小是否符合预期。
2024-09-25 13:35:12
950
原创 C++ bitset(位图)的介绍和使用
面试题给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯】遍历,时间复杂度O(N)排序(O(NlogN)),利用二分查找: logN单从方法上来说这两种方法都是可以的,但是从内存上来说,这里有40亿个整数,换算一下就相当于16G,也就是说要操作这些数据的话需要占用16G的内存,内存消耗是很大的,所以从内存上来看,这两种方法都是不合适的。位图解决。
2024-09-24 20:03:30
2634
原创 C++笔试强训15、16、17
在同一个作用域内,可以有多个同名函数,但这些函数的参数列表(参数的数量、类型或顺序)必须不同。重载是编译时多态的一种体现。
2024-09-23 13:26:40
1007
原创 C++笔试强训10
a是const int类型的,&a就是const int*类型的,此处强转成int*类型赋值给p,然后通过p修改了值为20,然后打印出a的值和*p的值。在主流编译器中空类的大小一般都是1,如果空类的大小为0的话,比如说类A创建了三个对象a、b、c,那在内存上,这三对象不就在同一个内存位置了嘛?const成员函数,const加在函数名()的后面,此处的const实际上修饰的是this指针,表明在该成员函数中,不能修改非静态的成员变量。故会先初始化a,后初始化b,和初始化列表中a,b的顺序无关,故会输出ab。
2024-07-31 12:16:20
841
原创 C++笔试强训9
本题中就是没有配对使用导致的问题,new class A[5]会调用5次构造函数,但在释放的时候应该使用delete[] pclassa才对,这里使用的是delete pclassa会导致未定义行为,题目不太严谨,此处应该给出出现未定义行为才对,不过如果非要选一个的话,那就是析构了一次,因为。C++中的静态数据成员是类的成员,但它不是类的任何特定对象的实例的一部分。A:将构造函数设为私有,new都创建不了,因为new一个对象的时候会调用该对象的构造函数,现在构造函数私有的,就不能创建了,故A错。
2024-07-28 18:38:47
941
原创 C++笔试强训8
本题让补充一个构造函数,成员变量是一个int类型的指针p,然后调用show函数返回*p之后是个5,说明我们要给p来new一块内存,并把5存进去,p=new int(x)符合题意,故选B。类里有个静态成员变量,构造函数中++了一次,析构函数中–的一次,故值不变,又因为静态成员变量是属于类的,故对象释放该静态成员变量依旧存在,故值不变还是0‘故选D。概念:是一个特殊的构造函数,是单参的,参数类型必须是类类型的引用,一般情况下会使用const来修饰例如: A(const A& a),指针可以改变所指对象,正确。
2024-07-25 18:16:42
1184
原创 C++笔试强训7
这意味着编译器会尝试将函数的代码直接插入到每个调用该函数的地方,而不是像通常那样进行函数调用(即,生成调用指令,跳转到函数代码,执行函数体,然后返回)。友元函数是在类外部定义的普通函数,它只能通过传入的参数(如果有的话)来访问类的成员,或者通过类的对象显式地访问(如果该函数设计为接受类的对象作为参数)。函数参数默认值又叫缺省参数,缺省参数必须从右向左开始缺省,必须连续给定缺省值,也就是说,从左到右,一旦遇到一个参数是缺省的,那么之后的参数也必须都是缺省的。指针是类成员函数特有的,用于指向调用该函数的对象。
2024-07-21 22:06:29
1153
2
原创 套接字编程一(简单的UDP网络程序)
其中netstat命令显示的信息中,Proto表示协议的类型,Recv-Q表示网络接收队列,Send-Q表示网络发送队列,Local Address表示本地地址,Foreign Address表示外部地址,State表示当前的状态,PID表示该进程的进程ID,Program name表示该进程的程序名称。bind需要传三个参数,第一个是套接字sockfd,第二个是一个sockaddr*,前面我们讲过,这里传参的实际上还是sockaddr_in这个结构体,只不过是传参的时候要强转成sockaddr*而已。
2024-07-21 13:54:35
1436
原创 C++笔试强训6
当然这里我们默认规定的是右边的比左边的大,即height[right]>height[left],结果是算一次后直接right++就行,如果是左边的比右边的大的话,即height[left]>height[right],这不是和前一种情况思路类似嘛,算一次后后面的就全不用算了,直接left–跳过这个边界,判断下一个边界就行了。◦ 如果改变右边界,无论右边界移动到哪里,新的水面的高度一定不会超过左边界,也就是不会超过现在的水面高度,但是由于容器的宽度减小,因此容器的容积一定会变小的。
2024-07-20 17:26:43
979
原创 C++笔试强训5
如果某个函数在当前文件中被调用但没有定义(且没有提供函数声明,除非使用了隐式声明,但现代C语言编程通常不推荐),编译器可能会报错或发出警告,但通常这些警告/错误只涉及当前文件,并不会检查该函数是否在项目的其他部分被定义。基础,a[i]相当于*(a+i),a[i][j]相当于*(*(a+i)+j),a[i][j][k]相当于*(*(*(a+i)+j)+k).p[0][0]就是10,*(p[0]+1)相当于p[0][1]是20,(*p)[2]相当于p[0][2],就是30。是发现被调用的函数未定义的阶段。
2024-07-14 21:56:51
988
原创 C++笔试强训4
a是数组名,&a表示数组的地址,&a+1表示指针偏移一个数组的大小,即5个int大小的字节数,因此&a+1指向数组最后一个元素的下一个元素,在强转为int*,进行±操作移动的步长就会改变成一个int大小,因此,p-1指向元素9,*(p-1)就是9。%o就是输出八进制的无符号数,0123,,以0开头·,本来就是八进制,所以输出为123,123是十进制,转化为八进制就是173.知识点,数组名是数组首元素的地址,&数组名是数组的地址,相同点,都指向同一个位置,不同点±操作移动的步长不一样。
2024-07-13 21:10:46
1194
原创 C++笔试强训2
(4)是指针常量,不能修改指针的指向的地址,但可以修改指向的数据。(b+2)=2,表示指针先向后偏移两个单位(两个int类型的字节数即8个字节)指向下标为2的内个元素(下标从0开始算),然后赋值成了2即变成了3,2,2,4.b++,即b指向下一个元素即下标为1的元素。a是数组名,单纯一个a是数组首元素的地址,&a的话是数组的地址,虽然指向的位置和a指向的位置一样,但区别在进行±运算的时候移动的步长不一样。常量指针指的是通过该指针不能修改它所指向的数据,但是指针的值(即它所指向的地址)是可以被修改的。
2024-07-06 22:37:42
927
3
原创 Linux线程安全,互斥量和条件变量
因此第二次申请锁失败之后这个线程就会被挂起,但是它是拿着锁被挂起的,因为被挂起了,所以就没办法释放锁,也就不会被唤醒,因此该执行流就处于一种死锁的状态了。由于–需要三条汇编指令才能完成,所以有可能线程1即thread1在执行完load 指令将共享变量ticket(1000)从内存加载到寄存器中之后就被切换了,此时thread1读到的数据是1000,当thread1被切换之后,寄存器中的数据会被当成thread1的上下文数据被保存起来,等到thread1被切回来的时候,再次恢复上下文。
2024-05-05 13:20:35
1292
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人