面经整理自网络,答案为个人补充内容。
我的C++学习笔记
1.多态的实现
2.如果父类和子类定义了一个函数名相同的函数,但不是虚函数,问父类指针指向的子类对象,调用这个函数是调用父类还是子类函数?同样,如果子类指针指向父类的对象,调用这个函数是调用父类还是子类函数?讲述一下它的原理
虚函数调用是怎么实现的。动态绑定发生时是怎么调用到子类的函数。多继承的子类有几个虚函数表。
static关键字
介绍一下extern
2.Static关键字各种用法,作用,Static声明的函数能否在其他文件中调用
3.Const关键字各种用法
类型转换,指针强制转换有什么危害,多继承子类父类指针转换(列出一种转换是否可以为什么或者为什么不行会有什么问题)
③const定义常量和define有什么区别?const定义的变量是执行时定义,define是预编译的时候直接替换。
6. const关键字的作用以及和defined的区别
7. C++有几种类型转换?
答:静态动态const和重编译四种,这个定义到处都是,这里就不写了。
可以在头文件定义static变量吗?为什么?
虚函数可以定义为static变量吗?
static
他又问static关键字是什么用。我说类里面就是静态成员函数,无论有几个类实例都只会有这一份拷贝。他说除了这个还有别的用处吗?我又说在方法里同样也是方法无论调用几次都只有这一份拷贝,而且只能在方法内被访问。他问还有吗?我想想说大概还能作为全局静态吧……记不太清了。
①引用与指针的区别?引用是别名,底层实现还是指针。使用的什么有什么区别?指针需要通过地址符取变量的地址,引用直接通过引用变量。
②const修饰指针有哪几种?区别?常量指针和指向常量的指针两种。指向常量的指针是指不能修改指针还是不能修改指针指向的变量?不能修改指针指向的变量。
⑦C++11一些新的特性有了解,比如智能指针?有三类,share、uni、和weak,weak是配合share使用的,它是通过一个和对象相关的计数器进行计数,当指向对象的指针的数目为0的时候,自动销毁对象,比new和delete人性化很多。
1.C++11的特性 ,然后介绍一下有哪几个智能指针,然后weak_ptr是怎么工作的。
7.C++11的新特性了解哪些,new的新特性
8.右值引用和move()方法说一下
9.所有的智能指针说一下,全局变量和静态变量可以用智能指针吗
10.shared_ptr实现一下
11.weak_ptr如何解决shared_ptr的循环引用问题,具体举一个例子说一下
//可以直接敲代码实现例子
智能指针有哪些?为什么要用?内存泄露情况怎么解决?
指针和引用区别,作参数区别
③介绍智能指针
指针和引用的区别
虚函数表的存放位置;
基类析构函数需要为什么需要设置成虚函数,写代码演示一下;
编译器给类缺省的成员函数有哪些?
在构造函数、析构函数中调用虚函数为什么有时可以有时不行?为什么会造成内存问题?
类管理内存的方式?除了构造函数和析构函数外还有吗?
怎样理解可重入函数?和不可重入有什么区别?机制是什么?为什么多线程要用可重入,怎样保证的线程安全?
然后问了下C++的虚函数能不能inline,以及宏和inline函数的区别
inline有什么用
④重载有了解吗?不同个数参数或者个数相同但参数类型顺序不同的同名函数。如果参数相同但返回变量类型不同可以吗?不可以。
空类的大小是否为0,空类里面有什么?
触发拷贝构造函数的情况;
12.stl平时用过哪些,大致把每一部分介绍一下
13.map和unordered_map用过吗,底层如何实现的,它们的区别有哪些
14.红黑树和哈希表有什么关系,介绍一下红黑树的特性,插入,删除
15.哈希表处理冲突的几种方法说一下
16.使用再哈希法处理过冲突的哈希表,平均查找的时间复杂度是多少
17.再哈希法如何优化
.列表和数组的区别 vector底层实现是什么?数据存放太多会怎么样?push_back底层实现是怎么做的?
(5)BST,AVL,红黑树
(6)vector的扩容,时间复杂度,扩容大小选择
(7)实现双端队列,O(1)时间复杂度下标读取
STL用得多吗?vector扩容,map用的什么实现?
哈希表清楚吗?解决冲突的方式?线性探查法如果新插入的冲突元素前面的元素被删除,怎么寻找?线性探查法和拉链法的区别?除了时间上还有别的吗?(注意不是链表和数组的区别?)
4.哈希冲突怎么解决 开放寻址法中删除元素该如何操作? 拉链法中链表太长了应该如何解决
map的底层逻辑是怎么实现的?vector的内存变化是怎样的?vector类型新增元素这个操作的时间复杂度如何?
有什么容器,map和set的插入复杂度是多少
常用的容器操作
二叉堆是什么?
介绍几种哈希算法
⑥C++中STL有用过吗?vector用过哪些功能?vector是变长数组它是怎么实现的?定义一个初始长度的数组,好像是(12),如果待存储容量超过数组长度,新开一个2倍容量的数组,把数组内容拷贝过去。
map有用过吗,它是一个key-value对,怎么实现的?红黑树。那红黑树能讲讲吗?这个不太会,它是一颗二叉查找树,增加了一些约束规则,根节点和叶节点都是黑色的,中间没层是红黑相间,通过这些规则约束,它也是平衡的。那它与普通的平衡二叉树有什么不同,为什么用红黑树而不用平衡二叉树?这个不会。
4、vector扩容机制,一个vector初始容量为1。扩到N的时间复杂度,估算往一个 vector 插入N个元素的时间复杂度。
5、vector要想释放一段内存用什么,resize会不会释放内存
map了解吗介绍一下,内部实现是什么,作为map的key有没有要求?有什么要求?除了重写类比较操作符以外还有别的排序方法吗。
map和unorder_map的底层数据结构
vector迭代器失效的情况
实现vector的可变数组功能
给你一个容器,怎样去实现它的底层内存管理?
STL容器
然后就是问C++的容器,STL的容器我有没有用过。当然实际上我没怎么用过,但是我全都看过,所以就说了几个vector、list、deque之类的。他就问vector和list有什么区别。向量和链表区别大了去了,一个是连续内存一个是链表。一个动态空间靠重分配一个本身就是离散的理论上没有空间限制。一个可以随机访问一个不行……等等等等,不详细列了。
他又问map用过吗,我说也用过。他map底层是怎么实现的?我说就是红黑树嘛。每个值是key-value对,然后他们按key值存在红黑树里。他就问红黑树定义,我凭印象大概给他说了一遍。说的时候我说红黑树不同于平衡二叉树,他就问那为什么有平衡二叉树了还要红黑树?红黑树有哪里好吗?我这里就卡住了,毕竟我没有思考过这个问题,我就凭想象说红黑维护代价应该比平衡二叉树简单一点吧。毕竟红黑再重新调整时只涉及单边子树,平衡涉及整棵树。这个因为是我临时诌出来的答案,我说的时候也没那么自信,他也反复追问“是指写程序的时候方便一些?”“你是说平衡效率更高?”最后我才整理出单边子树的说法。事后网上查了查,好像确实大概是这么回事,lucky。
红黑树结束后他又问了大小顶堆,问这是怎么实现的。我说说是堆实际上是个数组。第i个数的左子节点是2i+1,右是2i+2,每次插入新元素就从最后一个分支节点也就是n/2开始检查它和子节点的大小关系。这是我面试前专门看过的。他听了挺满意,然后问了个用大小顶堆做的问题。给定一个数组,求前n大的数。(这问题我研究生面试也被问过,当时我还不知道大顶堆……)我就很顺口,那就维护一个长度为10的大顶堆嘛。他说你确定是大顶堆?我还觉得奇怪,找最大不是大顶堆?然后他就要我详细讲,我说着说着才反应过来,哦应该是小顶堆……我改过来后他又详细问了一遍,我就详细说了实现过程。改了过来应该也算是可以……吧?
Stdcall void func()有什么作用?
windows下的WINAPI void func()?原理是什么?
6、new和malloc 的区别,要想new不抛出异常怎么办。
new和malloc的区别
c 11 的new 有什么新特性
(2)new和delete过程,顺序
7、new[]不配合delete[]使用会发生什么情况,为什么。
Malloc的底层原理?为什么不直接用brk()调用?怎样去分配内存?
C++二维数组在内存中如何存放? 不同的读取数组方式会有什么影响?
堆和栈的区别
Select,poll,epoll的区别?Epoll和poll都有哪些具体的区别?除了这些区别它们一样吗?有Epoll了还要其他两个函数干什么?
(8)进程和线程,单核CPU能跑多线程吗
(9)线程共享的内容,进程间的相互隔离怎么理解?
(4)字符串逆置,传char*
(5)100w的数据,name,26个字符,要找匹配BC的那些项。ABCD可行,BCDA可行,FBDC不可行。这里我说前缀树,然后问题在于不是B打头怎么办,面试官提示是否可以对前缀树的结构进行改进?不进行遍历来判断?没想出来
9.数据库的索引是用什么实现的
10.B树和B+树有什么区别,为什么不用红黑树或者普通二叉树来实现索引//重点:减少IO次数
现场笔试:手撕代码实现size_t strlcpy(char* dst, const char* src,size_t size)
4.寻路问题。飞机想由出口到终点。让我设计系统。(即设计图怎么表示)
答:面试官说从简单的来。我就说用二维矩阵表示,障碍为1,其他为0。
5.(也就是二维矩阵每个数字表示多大体积)障碍体积应该多大?物体有体积应该怎么考虑?
答:跟飞机的最小行进单位有关。
6.寻路算法
答:BFS
7.如果图很大,怎么优化?
答:答了A*,动态规划以及图最短路径等算法。
排名实时更新,你排在几万名的位置,怎么快速查到自己的排名-(这个感觉回答的不太好。。。回答了一个二分查找的思路,但有一些坑要注意)
了解epoll吗,为什么epoll会比较快,epoll的原理
linux文件最大有多大-(回答的不太符合面试官想要的答案,又提示了虚拟内存)>虚拟内存原理
16.单链表原地排序
1.老问题,快速找到自己在排行榜的排名
17. 游戏中人物有视野,怎样实现把视野中的人显示出来视野外的不显示(不太记得了)
左值引用和右值引用(给几个表达式让判断);
给一个结构体算它的sizeof,用什么可以改变对齐;
写代码:定义边界相连的三角形集合称为“岛“,给一组三角形的点坐标如:(0, 1, 2), (0, 2, 3), (4, 5, 6);问有几个“岛”,例子是2个岛(25分钟);
有什么要问的?
2道代码题
1.爬楼梯问题
2.环形缓冲区push pop popall操作
基础
写完代码题后又要求实现一个循环链表 问循环列表与单向链表之间的优缺点
手写个template模板函数
怎么实现线程安全
线程同步的方式
怎么实现单例模式?
实现一个函数,输入整型参数size和k,返回大小为size字节的内存且满足k字节对齐
2、100W个起始结束IP段以及对应中文名,建一个系统,让它可以很快查找出某个IP对应的中文名。。(隐约看到别人有发过类似题目?我没准备过,在面试官提示下答得还是很差。。)
介绍一下DAG
手撕一个拓扑排序
设计一种数据结构,有关聊天界面的,要满足:
1、数据结构内按照上一次聊天进行排序
2、支持一个节点变成头部
3、在头部插入新节点
4、尾部删除节点
答带尾指针的链表,问查询有没有优化,我觉得没有
介绍一下单例设计模式,怎么实现
一个父类A里有一个虚函数f(),被A类里另外一个普通函数g()调用,g()被构造函数调用,类B继承类A,重写f()
现在A *a = new B,问调用,的是哪个f(),详细说一下编译器在这里是怎么做的
日志记录ip地址,如何统计ip地址访问次数
③栈和堆区别?
⑤介绍DFS和DFS
①字符串压缩(a-z,A-Z),把一个字符串用比字符串本身更小的空间存储。我想到的是用52进制的哈希函数,映射为一个整数。面试官让我举一个具体实例分析一下,然后明白之后说你这个压缩后有可能比原始字符串更长。面试完和同学讲这个,同学说用霍夫曼编码,当时压根就没想起来。
②二维网格,有些网格有障碍物不能通过,给定起点和终点,找一条路径但没要求最短。BFS或者DFS,如果找最短,把所有路径存下来找一条最短的。面试官说如果网格非常大,执行就很慢,有没有什么优化?没想出来,然后面试官提示分治。怎么分治呢?找一个中间点,如果能够和起点和终点联通,继续找中间点。面试官说这个找中间点好像不太好找,不一定和起点和终点通。然后我又说用双指针的方法,起点和终点同时往外搜索,直到相遇。这个题也答得不好。
图的最小生成树
实现一个数据结构,能取到队列的最大值
内存里加载了10个资源,有10个新资源等待加载,怎么调度;