C++面试常见问题分享
一、基础知识
1、基本语言
1、说一下static关键字的作用
2、说一下C++和C的区别
3、说一下C++中static关键字的作用
4、请说一下static的作用
5、说一说c++中四种cast转换
6. 请说一下C/C++ 中指针和引用的区别
7、给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内,给出思路并手写代码
8、怎么判断一个数是二的倍数,怎么求一个数中有几个1,说一下你的思路并手写代码
9、请你说一下你理解的c++中的smart pointer四个智能指针
10、请回答一下数组和指针的区别
11、请你回答一下野指针是什么
12、请你介绍一下C++中的智能指针
13、请你回答一下智能指针有没有内存泄露的情况
14、请你来说一下智能指针的内存泄漏如何解决
15、请你理解的c++中的引用和指针
16、请你来说一下C++中的智能指针
17、请你回答一下为什么析构函数必须是虚函数,为什么C++默认的析构函数不是虚函数
18、请你来说一下函数指针
19、请你来说一下fork函数
20、请你来说一下C++中析构函数的作用
21、请你来说一下静态函数和虚函数的区别
22、请你来说一说重载和覆盖
23、请你来说一说static关键字
24.、请你说一说strcpy和strlen
25、请你说一说你理解的虚函数和多态
26、请你来回答一下++i 和 i++的区别
27、请你来说一说++i 和 i++的实现
28、请你来写个函数在main函数执行前先运行
29、有段代码写成了下边这样,如果在只修改一个字符的前提下,使代码输出20个hello
30、请你来说一下智能指针shared_ptr的实现
31、以下四行代码的区别是什么
32、请你来说一下C++里是怎么定义常量的?常量存放在内存的哪个位置?
33、请你来回答一下const修饰成员函数的目的是什么?
34、如果同时定义了两个函数,一个带const,一个不带,会有问题吗?
35、请你来说一说隐式类型转换
36、说说你了解的类型转换
37、请你来说一说C++函数栈空间的最大值
38、请你来说一说extern“C”
39、请你回答一下new/delete与malloc/free的区别是什么
40、请你说说你了解的RTTI
41、请你说说虚函数表具体是怎样实现运行时多态的?
42、请你说说C语言是怎么进行函数调用的?
43、请你说说C语言参数压栈顺序?
44、请你说说C++如何处理返回值?
45、请你回答一下C++中拷贝赋值函数的形参能否进行值传递?
46、请你回答一下malloc与new区别
47、请你说一说select
48、请你说说fork,wait,exec函数
49、请你回答一下静态函数和虚函数的区别
50、请你说一说重载和覆盖
51、请你说一说static关键字
52、请你说一说strcpy和strlen
2、容器和算法
1、请你来说一下map和set有什么区别,分别又是怎么实现的
2、请你来介绍一下STL的allocaotr
3、请你来说一说STL迭代器删除元素
4、请你说一说STL中MAP数据存放形式
5、请你讲讲STL有什么基本组成
6、请你说说STL中map与unordered_map
7、请你说一说vector和list的区别,应用,越详细越好
8、请你来说一下STL中迭代器的作用,有指针为何还要迭代器
9、请你说一说epoll原理
10、请你说一说STL迭代器是怎么删除元素的呢
11、请你说一说STL中MAP数据存放形式
12、n个整数的无序数组,找到每个元素后面比它大的第一个数,要求时间复杂度为O(N)
13、请你回答一下STL里resize和reserve的区别
14、请你说一说stl里面set和map怎么实现的
3、类和数据抽象
1.请你来说一下C++中类成员的访问权限
2、请你来说一下C++中struct和class的区别
3、请你回答一下C++类内可以定义引用数据成员吗?
4、面向对象与泛型编程
1、请你回答一下什么是右值引用,跟左值又有什么区别?
5、编译与底层
1、 请你来说一下一个C++源文件从文本到可执行文件经历的过程?
2、 请你来回答一下include头文件的顺序以及双引号””和尖括号的区别?
3、 请你回答一下malloc的原理,另外brk系统调用和mmap系统调用的作用分别是什么?
4、 请你说一说C++的内存管理是怎样的?
5、请你来说一下C++/C的内存分配
6、请你回答一下如何判断内存泄漏?
7.请你来说一下什么时候会发生段错误
8、请你来回答一下什么是memory leak,也就是内存泄漏
9、请你来回答一下new和malloc的区别
10、请你来说一下 共享内存相关api
11、请你来说一下reactor模型组成
12、请自己设计一下如何采用单线程的方式处理高并发
13、请你说说C++如何处理内存泄漏?
14、请你说说select,epoll的区别,原理,性能,限制都说一说
15、请你说一说C++ STL 的内存优化
6、C++11
1、请问C++11有哪些新特性?
2、请你详细介绍一下C++11中的可变参数模板、右值引用和lambda这几个新特性。
二、操作系统
1、请你说一下进程与线程的概念,以及为什么要有进程线程,其中有什么区别,他们各自又是怎么同步的
答:
进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发;
线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发;线程是操作系统可识别的最小执行和调度单位。每个线程都独自占用一个虚拟处理器:独自的寄存器组,指令计数器和处理器状态。每个线程完成不同的任务,但是共享同一地址空间(也就是同样的动态内存,映射文件,目标代码等等),打开的文件队列和其他内核资源。
区别:
1.一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程依赖于进程而存在。
2.进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。(资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。)
3.进程是资源分配的最小单位,线程是CPU调度的最小单位;
4.系统开销: 由于在创建或撤消进程时,系统都要为之分配或回收资源,如内存空间、I/o设备等。因此,操作系统所付出的开销将显著地大于在创建或撤消线程时的开销。类似地,在进行进程切换时,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU环境的设置。而线程切换只须保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。可见,进程切换的开销也远大于线程切换的开销。
5.通信:由于同一进程中的多个线程具有相同的地址空间,致使它们之间的同步和通信的实现,也变得比较容易。进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。在有的系统中,线程的切换、同步和通信都无须操作系统内核的干预
6.进程编程调试简单可靠性高,但是创建销毁开销大;线程正相反,开销小,切换速度快,但是编程调试相对复杂。
7.进程间不会相互影响 ;线程一个线程挂掉将导致整个进程挂掉
8.进程适应于多核、多机分布;线程适用于多核
进程间通信的方式:
进程间通信主要包括管道、系统IPC(包括消息队列、信号量、信号、共享内存等)、以及套接字socket。
1.管道:
管道主要包括无名管道和命名管道:管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信
1.1 普通管道PIPE:
1)它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端
2)它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)
3)它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
1.2 命名管道FIFO:
1)FIFO可以在无关的进程之间交换数据
2)FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。
2. 系统IPC:
2.1 消息队列
消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标记。 (消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点)具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息;
特点:
1)消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。
2)消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。
3)消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。
2.2 信号量semaphore
信号量(semaphore)与已经介绍过的 IPC 结构不同,它是一个计数器,可以用来控制多个进程对共享资源的访问。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。
特点:
1)信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
2)信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。
3)每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。
4)支持信号量组。
2.3 信号signal
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
2.4 共享内存(Shared Memory)
它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等
特点:
1)共享内存是最快的一种IPC,因为进程是直接对内存进行存取
2)因为多个进程可以同时操作,所以需要进行同步
3)信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问
3.套接字SOCKET:
socket也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同主机之间的进程通信。
线程间通信的方式:
临界区:通过多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问;
互斥量Synchronized/Lock:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问
信号量Semphare:为控制具有有限数量的用户资源而设计的,它允许多个线程在同一时刻去访问同一个资源,但一般需要限制同一时刻访问此资源的最大线程数目。
事件(信号),Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作
2、请你说一说Linux虚拟地址空间
答:为了防止不同进程同一时刻在物理内存中运行而对物理内存的争夺和践踏,采用了虚拟内存。
虚拟内存技术使得不同进程在运行过程中,它所看到的是自己独自占有了当前系统的4G内存。所有进程共享同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。 事实上,在每个进程创建加载时,内核只是为进程“创建”了虚拟内存的布局,具体就是初始化进程控制表中内存相关的链表,实际上并不立即就把虚拟内存对应位置的程序数据和代码(比如.text .data段)拷贝到物理内存中,只是建立好虚拟内存和磁盘文件之间的映射就好(叫做存储器映射),等到运行到对应的程序时,才会通过缺页异常,来拷贝数据。还有进程运行过程中,要动态分配内存,比如malloc时,也只是分配了虚拟内存,即为这块虚拟内存对应的页表项做相应设置,当进程真正访问到此数据时,才引发缺页异常。
请求分页系统、请求分段系统和请求段页式系统都是针对虚拟内存的,通过请求实现内存与外存的信息置换。
虚拟内存的好处:
1.扩大地址空间;
2.内存保护:每个进程运行在各自的虚拟内存地址空间,互相不能干扰对方。虚存还对特定的内存地址提供写保护,可以防止代码或数据被恶意篡改。
3.公平内存分配。采用了虚存之后,每个进程都相当于有同样大小的虚存空间。
4.当进程通信时,可采用虚存共享的方式实现。
5.当不同的进程使用同样的代码时,比如库文件中的代码,物理内存中可以只存储一份这样的代码,不同的进程只需要把自己的虚拟内存映射过去就可以了,节省内存
6.虚拟内存很适合在多道程序设计系统中使用,许多程序的片段同时保存在内存中。当一个程序等待它的一部分读入内存时,可以把CPU交给另一个进程使用。在内存中可以保留多个进程,系统并发度提高
7.在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要实际物理内存的连续空间,可以利用碎片
虚拟内存的代价:
1.虚存的管理需要建立很多数据结构,这些数据结构要占用额外的内存
2.虚拟地址到物理地址的转换,增加了指令的执行时间。
3.页面的换入换出需要磁盘I/O,这是很耗时的
4.如果一页中只有一部分数据,会浪费内存。
3、请你说一说操作系统中的程序的内存结构
一个程序本质上都是由BSS段、data段、text段三个组成的。可以看到一个可执行程序在存储(没有调入内存)时分为代码段、数据区和未初始化数据区三部分。
BSS段(未初始化数据区):通常用来存放程序中未初始化的全局变量和静态变量的一块内存区域。BSS段属于静态分配,程序结束后静态变量资源由系统自动释放。
数据段:存放程序中已初始化的全局变量的一块内存区域。数据段也属于静态内存分配
代码段:存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域属于只读。在代码段中,也有可能包含一些只读的常数变量
text段和data段在编译时已经分配了空间,而BSS段并不占用可执行文件的大小,它是由链接器来获取内存的。
bss段(未进行初始化的数据)的内容并不存放在磁盘上的程序文件中。其原因是内核在程序开始运行前将它们设置为0。需要存放在程序文件中的只有正文段和初始化数据段。
data段(已经初始化的数据)则为数据分配空间,数据保存到目标文件中。
数据段包含经过初始化的全局变量以及它们的值。BSS段的大小从可执行文件中得到,然后链接器得到这个大小的内存块,紧跟在数据段的后面。当这个内存进入程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区。
可执行程序在运行时又多出两个区域:栈区和堆区。
栈区:由编译器自动释放,存放函数的参数值、局部变量等。每当一个函数被调用时,该函数的返回类型和一些调用的信息被存放到栈中。然后这个被调用的函数再为他的自动变量和临时变量在栈上分配空间。每调用一个函数一个新的栈就会被使用。栈区是从高地址位向低地址位增长的,是一块连续的内存区域,最大容量是由系统预先定义好的,申请的栈空间超过这个界限时会提示溢出,用户能从栈中获取的空间较小。
堆区:用于动态分配内存,位于BSS和栈中间的地址区域。由程序员申请分配和释放。堆是从低地址位向高地址位增长,采用链式存储结构。频繁的malloc/free造成内存空间的不连续,产生碎片。当申请堆空间时库函数是按照一定的算法搜索可用的足够大的空间。因此堆的效率比栈要低的多。
4、请你说一说操作系统中的缺页中断
5、请你回答一下fork和vfork的区别
6、请问如何修改文件最大句柄数?
7、请你说一说并发(concurrency)和并行(parallelism)
8、请问mysql的端口号是多少,如何修改这个端口号
9、请你说一说操作系统中的页表寻址
10、请你说一说有了进程,为什么还要有线程?
11、请问单核机器上写多线程程序,是否需要考虑加锁,为什么?
12、请问线程需要保存哪些上下文,SP、PC、EAX这些寄存器是干嘛用的
13、请你说一说线程间的同步方式,最好说出具体的系统调用
14、请你说一下多线程和多进程的不同
15、请你说一说进程和线程的区别
16、游戏服务器应该为每个用户开辟一个线程还是一个进程,为什么?
17、请你说一说OS缺页置换算法
18、请你说一说进程和线程区别
19、请你说一下多进程和多线程的使用场景
20、请你说一说死锁发生的条件以及如何解决死锁
21、请问虚拟内存和物理内存怎么对应
22、请你说一说操作系统中的结构体对齐,字节对齐
23、请问进程间怎么通信
24、请你说一下虚拟内存置换的方式
25、请你说一下多线程,线程同步的几种方式
26、请你讲述一下互斥锁(mutex)机制,以及互斥锁和读写锁的区别
27、请回答一下进程和线程的区别
28、请你说一说进程状态转换图,动态就绪,静态就绪,动态阻塞,静态阻塞
29 、A a = new A; a->i = 10;在内核中的内存分配上发生了什么?
30、给你一个类,里面有static,virtual,之类的,来说一说这个类的内存分布
31、请你回答一下软链接和硬链接区别
32、请问什么是大端小端以及如何判断大端小端
33、请你回答一下静态变量什么时候初始化
34、请你说一说用户态和内核态区别
35、请问如何设计server,使得能够接收多个客户端的请求
36、死循环+来连接时新建线程的方法效率有点低,怎么改进?
37、请问怎么唤醒被阻塞的socket线程?
38、请问怎样确定当前线程是繁忙还是阻塞?
39、空闲的进程和阻塞的进程状态会不会在唤醒的时候误判?
40、请问就绪状态的进程在等待什么?
41、请你说一说多线程的同步,锁的机制
42、两个进程访问临界区资源,会不会出现都获得自旋锁的情况?
43、假设临界区资源释放,如何保证只让一个线程获得临界区资源而不是都获得?
44、windows消息机制知道吗,请说一说
45、C++的锁你知道几种?
46、说一说你用到的锁
47、请你说一说死锁产生的必要条件?
48、请你说一说什么是线程和进程,多线程和多进程通信方式
49、请你说一说内存溢出和内存泄漏
50、进程和线程的区别,你都使用什么线程模型
51、请你来说一说协程
52、系统调用是什么,你用过哪些系统调用
53、请你来手写一下fork调用示例
54、请你来说一说用户态到内核态的转化原理
55、请你说一下源码到可执行文件的过程
56、请你来说一下微内核与宏内核
57、请你说一下僵尸进程
58、请问GDB调试用过吗,什么是条件断点
59、请你来介绍一下5种IO模型
60、请你说一说异步编程的事件循环
61、请你回答一下操作系统为什么要分内核态和用户态
62、请你回答一下为什么要有page cache,操作系统怎么设计的page cache
63、server端监听端口,但还没有客户端连接进来,此时进程处于什么状态?
64、请问如何设计server,使得能够接收多个客户端的请求
65、死循环+来连接时新建线程的方法效率有点低,怎么改进?
66、就绪状态的进程在等待什么?
67、请你说一下多线程的同步,锁的机制
68、两个进程访问临界区资源,会不会出现都获得自旋锁的情况?
69、假设临界区资源释放,如何保证只让一个线程获得临界区资源而不是都获得?
70、请问怎么实现线程池
71、Linux下怎么得到一个文件的100到200行
72、请你来说一下awk的使用
73、请你来说一下linux内核中的Timer 定时器机制
8、请介绍一下操作系统中的中断
三、计算机网络
1、你的研究方向是无线传感器网络,请问怎么确保节点传输存储的可靠性
2、请你说一下TCP怎么保证可靠性,并且简述一下TCP建立连接和断开连接的过程
3、请你说一说TCP的模型,状态转移
4、请回答一下HTTP和HTTPS的区别,以及HTTPS有什么缺点?
5、请你说一说HTTP和HTTPS的不同
6、请你说一说HTTP返回码
7、请你说一说IP地址作用,以及MAC地址作用
9、请回答OSI七层模型和TCP/IP四层模型,每层列举2个协议
10、请你说一说TCP的三次握手和四次挥手的过程及原因
11、搜索baidu,会用到计算机网络中的什么层?每层是干什么的
12、请你说一说TCP拥塞控制?以及达到什么情况的时候开始减慢增长的速度?
13、请问TCP用了哪些措施保证其可靠性
14、请你说说TCP/IP数据链路层的交互过程
15、请你说说传递到IP层怎么知道报文该给哪个应用程序,它怎么区分UDP报文还是TCP报文
16、请问你有没有基于做过socket的开发?具体网络层的操作该怎么做?(其实就是网络编程的基本步骤)
17、请问server端监听端口,但还没有客户端连接进来,此时进程处于什么状态?
18、请问TCP三次握手是怎样的?
19、请问tcp握手为什么两次不可以?为什么不用四次?
22、请你来说一下TCP拥塞控制?
20、TCP和UDP的区别和各自适用的场景
21、请你来说一下TCP三次握手四次挥手的过程,为什么tcp连接握手需要三次, time_wait状态
22、请你来说一说http协议
23、请你来说一下GET和POST的区别
24、请你来说一下socket编程中服务器端和客户端主要用到哪些函数
25、请你来说一下数字证书是什么,里面都包含那些内容
26、请你来介绍一下UDP的connect函数
27、请你讲述一下TCP三次握手,四次挥手,以及为什么用三次握手?
28、请你说一下阻塞,非阻塞,同步,异步
29、请你讲述一下Socket编程的send() recv() accept() socket()函数?
30、请你说一下http协议会话结束标志怎么截出来?
31、请你说一说三次握手
32、请你说一说四次挥手
33、请你说一说TCP/IP数据链路层的交互过程
四、数据库
1、数据库基础
1、请你说一下数据库事务以及四个特性
2、请你说一说数据库的三大范式
3、请你介绍一下数据库的ACID特
4、请你说一说数据库索引
5、请你说一说数据库事务
6、请你说一说数据库事务隔离
7、请你说一说inner join和left join
8、请你聊一聊数据库事物的一致性
9、请你说说索引是什么,多加索引一定会好吗
10、k-v存储中,key有哪些要求?
11、介绍数据库中的WAL技术
2、Mysql
1、请你说一说MYSQL的四种隔离状态
2、请你介绍一下mysql的MVCC机制
3、请问SQL优化方法有哪些
4、请你说一下MySQL引擎和区别
3、Redis
1、请你回答一下MongoDB和redis的区别
2、请你说一下mysql引擎以及其区别
3、请你来说一说Redis的定时机制怎么实现的
4、请你来说一说Redis是单线程的,但是为什么这么高效呢?
5、请问Redis的数据类型有哪些,底层怎么实现?
6、请问Redis的rehash怎么做的,为什么要渐进rehash,渐进rehash又是怎么实现的?
7、请你来说一下Redis和memcached的区别
8、请问Redis怎么实现的定期删除功能
9、请你说一说Redis对应的命令和数据类型...
五、算法与数据结构
1、树
1、请你来说一说红黑树和AVL树的定义,特点,以及二者区别
2、请你聊一聊哈夫曼编码
3、请你回答一下map底层为什么用红黑树实现
4、请你介绍一下B+树
5、请你说一说map和unordered_map的底层实现
6、请你回答一下map和unordered_map优点和缺点
7、请你回答一下epoll怎么实现的
8、请你说一说C++两种map
9、请问红黑树了解吗
10、请你说一说红黑树的性质还有左右旋转
11、请你说一说红黑树的原理以及erase以后迭代器的具体分布情况?
12、请你实现二叉树的层序遍历并输出
13、手写代码:二叉树序列化反序列化
2、堆与栈
1、请说一说你理解的stack overflow,并举个简单例子导致栈溢出
2、请你回答一下栈和堆的区别,以及为什么栈要快
3、手写代码:两个栈实现一个队列
4、请你来说一下堆和栈的区别
5、请你说一说小根堆特点
3、数组
1、请你回答一下Array&List, 数组和链表的区别
2.一个长度为N的整形数组,数组中每个元素的取值范围是[0,n-1],判断该数组否有重复的数,请说一下你的思路并手写代码
4、排序
1、请你来手写一下快排的代码
2、请问求第k大的数的方法以及各自的复杂度是怎样的,另外追问一下,当有相同元素时,还可以使用什么不同的方法求第k大的元素
3、请你来介绍一下各种排序算法及时间复杂度
4、请你说一说你知道的排序算法及其复杂度
5、请问海量数据如何去取最大的k个
6、请你说一说Top(K)问题
7、请问快排的时间复杂度最差是多少?什么时候时间最差
8、请问稳定排序哪几种?
9、请你介绍一下快排算法;以及什么是稳定性排序,快排是稳定性的吗;快排算法最差情况推导公式
5、哈希
1、请你来说一说hash表的实现,包括STL中的哈希桶长度常数。
2、请你回答一下hash表如何rehash,以及怎么处理其中保存的资源
3、请你说一下哈希表的桶个数为什么是质数,合数有何不妥?
4、请你说一下解决hash冲突的方法
5、请你说一说哈希冲突的解决方法
6、动态规划
1、请你手写代码:最长公共连续子序列
2、手写代码:求一个字符串最长回文子串
3、手写代码:查找最长回文子串
7、链表
1.请你手写代码,如何合并两个有序链表
2、手写代码:反转链表
3、判断一个链表是否为回文链表,说出你的思路并手写代码
4、请你手写链表反转
5、什么是单向链表,如何判断两个单向链表是否相交
7、高级算法
1、如果让你做自然语言理解(NLU),在处理语言规则的时候大概会用到什么算法
2、请问加密方法都有哪些
3、什么是LRU缓存
4、请你说一说洗牌算法
8、字符串
1、给你一个字符串,找出第一个不重复的字符,如“abbbabcd”,则第一个不重复就是c
六、项目相关
1、请你回答一下git中Merge和rebase区别
七、设计模式
1、请问你用过哪些设计模式,介绍一下单例模式的多线程安全问题
2、请问你了解哪些设计模式?
3、请问如何保证单例模式只有唯一实例?你知道的都有哪些方法?
4、请你说一说OOP的设计模式的五项原则
5、请你说说工厂模式的优点?
6、请你说一下观察者模式
7、请你介绍一下单例模式
8、单例模式中的懒汉加载,如果并发访问该怎么做?
9、装饰器模式和单例模式,使用单例模式应该注意什么
八、场景题
1、给你两个球,100层楼,每个球在一定高度扔下去会碎,怎么用最少的次数给判断是几层楼能把求摔碎?
九、分布式与架构
1、分布式缓存和分布式存储的设计