C/C++面试题总结(2)

C++部分:
1.static(静态)变量有什么作用?
2.virtual关键字用法
3.const有哪些作用 或《王道程序员求职宝典》P95
4.new/delete与malloc/free的区别是什么(注:malloc无返回类型,记一下原函数)
5.内存分配形式有哪些?
6.内联函数的作用?内联函数里面可以写for循环吗?
7.什么是内存泄漏?
8.为什么会内存泄漏?如何确定内存泄漏?怎么定位?
9.野指针?空指针?
10.typedef 和 define有什么区别
11.C++中宏定义与内联函数有什么区别
12.定义常量谁更好? #define还是const?
13.重载、覆盖、隐藏有什么区别?
14.全局变量和静态变量有什么异同
15.空类中自带哪些函数?
16.构造函数可以为virtual吗?为什么?
17.基类的析构函数为何要设置为虚函数?
18.抽象类和接口类的区别?
19.C++中虚函数是如何实现的?
20.STL 的考察,比如迭代器和指针的区别,迭代器失效,容器,迭代器,算法之间的关系。
21.map 和 set 的区别和使用
22.C++中的 STL 中vector是怎么样实现动态增长的(实现机制)
23.直接手写代码:实现一个动态数组
24.deque和queque的区别?deque(双端队列)应用场景是什么?
25.指针和引用的区别(《王道程序员求职宝典》P133下半页)
26.怎么实现内存池?(联系std::allocator)

数据结构与算法部分:
深度优先搜索代码:

广度优先搜索代码:

1.实现二分查找(注意 mid赋值时,尽量写m id=L+(R-L)/2取代mid=(L+R)/2,因为(L+R)计算时有可能产生溢出)
2.快速排序的实现
3.堆排序实现?应用场景?
4.判断两个链表是否有公共节点
5.链表的环(《王道程序员求职宝典》P200)
6.头插法,尾插法插入结点
7.判断链表是否有环
8.链表和二叉排序树的相互转换
9.找链表倒数第k个结点
10.怎么针对链表进行快速排序?
11.合并两个有序数组到一个中
12.二叉树的前、中、后序非递归遍历代码实现
13.树的相关概念,比如平衡二叉树,线索二叉树,二叉树的查找和排序,红黑树等等
14.手写代码:n*n的棋盘,初始点x,y。有个马走日,看它是否能不重不漏地走完棋盘上所有点。
15.如果文件特别大,不能装到内存里,怎么办?

Linux部分:

1.锁、信号量
2.怎么调试段错误(gdb),使用gdb怎么调试多线程程序
3.Linux 下的 fork 函数怎么理解,它会产生哪些值(三种),分别是什么含义
4.Linux 下中断的理解, SIGPIPE、SIGINT 等等。
5.Linux 下的僵尸进程和孤儿进程的概念,怎么预防和处理他们
6.Linux 下的阻塞和非阻塞,同步与异步的区别
7.Linux 下的 I/O 复用,select、poll、epoll 的区别,其中 epoll 有哪两种形式(LT,ET),他们的区别与联系
8.操作系统中进程的互斥和死锁,进程间通信的通讯有哪几种,说出你用的最多的几种
9.如何确定一个进程应该开多少线程
10.什么是不可重入函数?如何编写不可重入函数?

设计模式:
1.设计模式有哪些(23 种),你熟悉的单例模式的优缺点是什么?
2.手写实现单例模式,确保其实线程安全的

网络编程部分:
1.TCP三次握手、四次挥手 过程,为什么?
1)tcp基于连接的,udp基于无连接的
2)tcp对系统资源要求多,udp要求少
3)udp程序结构简单
4)tcp是流模式,udp是数据报模式
5)tcp保证正确性,udp可能丢包;tcp保证数据顺序,udp不能保证
2.TCP能够设置的选项有哪些?各自的意义是什么?
SO_REUSEADDR
SO_REUSEPORT
SO_KEEPALIVE
TCP_NODELAY
TCP_CORK

3.TCP通过下列方式提供可靠性:
A 将数据截断成合理长度(应用程序被分割成TCP认为合适的发送的数据块)
B 超时重传(TCP发送一个段后,启动定时器,等待目的端确认收到这个报文段,没有确认,重发)
C 确认应答(收到数据后,会做一个确认,推迟几分之一秒,为了校验)
D 数据校验(首部和数据的校验和,有差错,丢弃不确认)
E 乱序重排(在IP的基础上传输,有可能乱序)
F 重复丢弃(IP重复)
G 流量控制(TCP连接的每一方都有固定大小缓冲区,防止较快主机致使较慢主机缓冲区溢出,滑动窗口)

4.Time_wait状态的作用
(1)保证TCP协议的全双工连接能够可靠关闭:要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。
(2)保证这次连接的重复数据段从网络中消失:由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。

5.怎么用udp实现可靠的传输协议?

6.http的工作过程
http://www.cnblogs.com/fakis/archive/2011/02/25/1976568.html

7.HTTP协议中GET方法与POST方法的区别
区别一:
get重点在从服务器上获取资源,post重点在向服务器发送数据;
区别二:
get传输数据是通过URL请求,以field(字段)= value的形式,置于URL后,
并用"?"连接,多个请求数据间用"&"连接,如 http://127.0.0.1/Test/login.action?name=admin&password=admin,这个过程用户是可见 的;
post传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的;
区别三:
Get传输的数据量小,因为受URL长度限制,但效率较高;
Post可以传输大量数据,所以上传文件时只能用Post方式;
区别四:
get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等;
post较get安全性较高

8.HTTP状态码?
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已被成功接收、理解、接受。
200 - 请求成功
3xx:重定向--要完成请求必须进行更进一步的操作。
301 - 资源(网页等)被永久转移到其它URL
4xx:客户端错误--请求有语法错误或请求无法实现。
400 (Bad Request/错误请求)
400 (SC_BAD_REQUEST)指出客户端请求中的语法错误。 
401 (Unauthorized/未授权)
401 (SC_UNAUTHORIZED)表示客户端在授权头信息中没有有效的身份信息时访问受到密码保护的页面。这个响应必须包含一个WWW-Authenticate的授权信息头。例如,在本书4.5部分中的“Restricting Access to Web Pages./限制访问Web页。” 
403 (Forbidden/禁止)
403 (SC_FORBIDDEN)的意思是除非拥有授权否则服务器拒绝提供所请求的资源。这个状态经常会由于服务器上的损坏文件或目录许可而引起。 
404 (Not Found/未找到)请求的资源(网页等)不存在
5xx:服务器端错误--服务器未能实现合法的请求。
500 - 内部服务器错误

9.http和https的区别

10.怎么提高服务器的并发处理能力?
答:涉及的方面有以下几种:
A. 提高CPU并发计算能力
(1)多进程&多线程
(2)减少进程切换,使用线程,考虑进程绑定CPU
(3)减少使用不必要的锁,考虑无锁编程
(4)考虑进程优先级
(5)关注系统负载
(6)关注CPU使用率,除了用户空间和内核空间的CPU使用率以外,还要关注I/O wait
B. 减少系统调用的使用
C. 考虑减少内存分配和释放
(1)改善数据结构和算法复杂度
(2)使用内存池
(3)考虑使用共享内存
D. 考虑使用持久连接
E. 改进I/O模型
(1)DMA技术
(2)异步I/O
(3)改进多路I/O就绪通知策略,epoll
(4)sendfile
(5)内存映射
(6)直接I/O
F. 改进服务器并发策略
(1)一个进程处理一个连接,非阻塞I/O,使用长连接 
(2)一个进程处理多个连接,异步I/O, 使用长连接

操作系统部分:
1.进程和线程的区别(《王道程序员求职宝典》P325例5)
2.进程间通信方式(偶尔考)
3.死锁,产生死锁的四个条件(《王道程序员求职宝典》P329)有时候 也会给定一个死锁场景,问如何做才能解除死锁。
4.如何实现无锁编程?
5.除了协程如何避免频繁线程切换

数据库部分:
1.索引怎么建立,索引有什么优点缺点

2.如何提高数据库查询速度?有哪些优化技巧?
https://www.jianshu.com/p/fea61b518dc4

3.如何获取一个表的前N条记录?

4.事务的特性ACID:
原子性(atomicity):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性(consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的默认规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性(isolation):当两个或者多个事务并发访问(此处访问指查询和修改的操作)数据库的同一数据时所表现出的相互关系。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

持久性(durability):在事务完成以后,该事务对数据库所作的更改便持久地保存在数据库之中,并且是完全的。

其他:
1.你的项目讲一下?遇到的困难?
2.你们部门有哪些组?都干什么?

原文地址:https://www.cnblogs.com/cthon/p/9660244.html