记录秋招各大厂C/C++ 、OS、网络题
题的来源点这里
找的是C开发岗位,所以只总结了C相关的题
1.malloc 创建的对象在堆还是栈中?
答:malloc可以随时开辟,不用时随时释放。这些数据是临时存放在一个特别的自用存储区,称其为堆。由于未在声明部分定义他们为变量或数组,因此不能通过变量名或数组去引用这些数据包,只能通过指针来引用。malloc分配出的空间不会被系统自动初始化,在使用前一定要初始化。
#网络
▲ 13 RestFul 是什么?RestFul 请求的 URL 有什么特点?
▲ 9 简述 HTTP 1.0,1.1,2.0 的主要区别
▲ 6 什么是跨域,什么情况下会发生跨域请求?
▲ 6 Cookie和Session的关系和区别是什么?
▲ 6 简述 JWT 的原理和校验机制
▲ 5 如何设计 API 接口使其实现幂等性?
▲ 3 简述 TCP 滑动窗口以及重传机制
作用:(1)提供TCP的可靠性;(2)提供TCP的流控特性
TCP的滑动窗口的可靠性也是建立在“确认重传”基础上的。
发送窗口只有收到对端对于本段发送窗口内字节的ACK确认,才会移动发送窗口的左边界。
接收端可以根据自己的状况通告窗口大小,从而控制发送端的接收,进行流量控制。
▲3 TCP 中 SYN 攻击是什么?如何防止?
过程:syn攻击是基于TCP连接的三次握手的半连接,属于DOS攻击。攻击者发送完第一次握手后,服务器维护一个未连接队列并发送回复,但是攻击者不发送第三次握手的ack,造成服务器会等待,浪费CPU和内存,在半连接存活时间内有大量的半连接就会造成服务器无法服务现象。
防御:减小超时时间;SYN网关和SYN代理;增大最大半连接数;SYN cookies技术
SYN Cookie是对TCP服务器端的三次握手协议作一些修改,专门用来防范SYN Flood攻击的一种手段。它的原理是,在TCP服务器收到TCP SYN包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCP ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。
#算法
▲ 11 实现快速排序
▲ 8 反转链表 (Leetcode)
▲ 8 爬楼梯 (Leetcode)
▲ 8 剑指 Offer 10- II. 青蛙跳台阶问题
▲ 5 快速排序的空间复杂度是多少?时间复杂度的最好最坏的情况是多少,有哪些优化方案?
▲ 4 实现归并排序
▲ 19 进程和线程之间有什么区别?
▲ 12 进程间有哪些通信方式?
▲ 4 多线程和多进程的区别是什么?
▲ 3 为什么进程切换慢,线程切换快?
都很简单,不解释。
#网络
▲ 18 TCP 怎么保证可靠传输?
▲17 HTTP 与 HTTPS 有哪些区别?
▲15 TCP 与 UDP 在网络协议中的哪一层,他们之间有什么区别?
▲ 14 简述 TCP 三次握手以及四次挥手的流程。为什么需要三次握手以及四次挥手?
▲ 13 TCP长连接和短连接有那么不同的使用场景?
▲ 10 HTTP 中 GET 和 POST 区别
▲ 8 TCP 与 UDP 在网络协议中的哪一层,他们之间有什么区别?
▲ 4 什么是 ARP 协议?
▲ 15 实现快速排序
▲ 15 简述 LRU 算法及其实现方式
▲ 14 按序打印 (Leetcode)
▲ 12 二叉树的前序遍历 (Leetcode)
▲ 11 数组中的第 K 个最大元素 (Leetcode)
▲ 11 旋转图像 (Leetcode)
▲ 11 剑指 Offer 10- II. 青蛙跳台阶问题
▲ 11 链表倒数第K个数 (Leetcode)
▲ 9 多数元素 (Leetcode)
▲ 7 用栈实现队列 (Leetcode)
▲ 6 搜索旋转排序数组 (Leetcode)
▲ 6 两数相加
▲ 10进程和线程之间有什么区别?
▲ 7进程通信中的管道实现原理是什么?
▲ 5进程间有哪些通信方式?
▲ 3 Linux 下如何排查 CPU 以及 内存占用过多?
linux下cpu过高问题排查
▲ 3 简述 Linux 虚拟内存的页面置换算法
▲ 3 简单介绍进程调度的算法
进程调度算法
▲2 LVS 的 NAT、TUN、DR 原理及区别
▲ 1 系统调用的过程是怎样的?操作系统是通过什么机制触发系统调用的?
▲ 19 HTTP 与 HTTPS 有哪些区别?
▲ 12 TCP 与 UDP 在网络协议中的哪一层,他们之间有什么区别?
▲ 8 简述什么是 XSS 攻击以及 CSRF 攻击?
▲ 6 简述 TCP 中的拥塞控制与滑动窗口机制
▲ 5 简述 TCP 三次握手以及四次挥手的流程。为什么需要三次握手以及四次挥手?
▲ 5 简述 HTTP 1.0,1.1,2.0 的主要区别
▲ 4 SSL握手流程为什么要使用对称秘钥?
▲ 3 简述 JWT 的原理和校验机制
▲ 3 TCP 的 keepalive 了解吗?说一说它和 http 的 keepalive 的区别?
▲ 2 一次 HTTP 的请求过程中发生了什么?
▲ 2 DNS 查询服务器的基本流程是什么?DNS 劫持是什么?
▲ 8 快速排序的空间复杂度是多少?时间复杂度的最好最坏的情况是多少,有哪些优化方案?
▲ 5 环形链表 (Leetcode)
▲ 5 用栈实现队列 (Leetcode)
▲ 4 AVL 树和红黑树有什么区别?
▲ 4 10亿个数中如何高效地找到最大的一个数以及最大的第 K 个数
▲ 3 数组中的逆序对 (Leetcode)
▲ 2 如何从一个数组输出随机数组
▲ 2 寻找旋转排序数组中的最小值 (leetcode)
▲ 2 红黑树是怎么实现平衡的?它的优点是什么?
▲ 1 和为 K 的子数组 (Leetcode)
▲ 23 进程间有哪些通信方式?
▲ 15 操作系统如何申请以及管理内存的?
▲ 13 简述 socket 中 select 与 epoll 的使用场景以及区别,epoll 中水平触发以及边缘触发有什么不同?
▲ 9 操作系统中,虚拟地址与物理地址之间如何映射?
▲ 8 I/O多路复用中 select, poll, epoll之间有什么区别,各自支持的最大描述符上限以及原因是什么?
▲ 6 简述操作系统中的缺页中断
▲ 5 进程和线程之间有什么区别?
▲ 4 两个线程交替打印一个共享变量
▲ 4 简述 mmap 的使用场景以及原理
▲ 3 Linux 中虚拟内存和物理内存有什么区别?有什么优点?
▲ 2 什么时候会由用户态陷入内核态?
▲ 1 简述 traceroute 命令的原理
▲ 1 简述 Linux 零拷贝的原理
▲ 1 简单介绍进程调度的算法
▲ 1 什么情况下,进程会进行切换?
▲ 1 简述自旋锁与互斥锁的使用场景
▲ 11 简述 C++ 右值引用与转移语义
右值引用与转移语义
▲ 11 const、static 关键字有什么区别
static 和 const关键字的作用
▲ 11 C++的多态是如何实现的?
添加链接描述
▲ 11 C++ 中解释类模板和模板类的区别
类模板和模板类
▲ 11 C++ 中哪些函数不能被声明为虚函数?
虚函数
▲ 4 C++ 中虚函数与纯虚函数的区别
虚函数纯虚函数
▲ 3 简述 C++ 中内存对齐的使用场景
内存对齐
▲ 1 构造函数为什么不能被声明为虚函数?
构造函数为什么不能被声明为虚函数
▲ 1 什么是内存泄漏,怎么确定内存泄漏?
内存泄漏
▲ 13 TCP 中常见的拥塞控制算法有哪些?
▲ 11 TCP 怎么保证可靠传输?
▲ 9 一次 HTTP 的请求过程中发生了什么?
▲ 9 简述常见的 HTTP 状态码的含义(301,304,401,403)
▲ 9 简述 TCP 三次握手以及四次挥手的流程。为什么需要三次握手以及四次挥手?
▲ 8 TCP的拥塞控制具体是怎么实现的?UDP有拥塞控制吗?
▲ 8 简述 HTTPS 的加密与认证过程
▲ 8 什么是跨域,什么情况下会发生跨域请求?
▲ 5 DNS 查询服务器的基本流程是什么?DNS 劫持是什么?
▲ 4 简述对称与非对称加密的概念
▲ 4 简述 OSI 七层模型,TCP,IP 属于哪一层?
▲ 4 HTTP 的方法有哪些?
▲ 3 简述 TCP 滑动窗口以及重传机制
▲ 1 TCP四次挥手过程以及所处状态,为什么还需要有 time_wait?
▲ 1 TCP 在什么情况下服务端会出现大量 CLOSE_WAIT ?
▲ 22 给定 100G 的 URL 磁盘数据,使用最多 1G 内存,统计出现频率最高的 Top K 个 URL
▲ 19 10亿个数中如何高效地找到最大的一个数以及最大的第 K 个数
▲ 17 合并两个有序链表 (Leetcode)
▲ 17 64 匹马,8 个赛道,找出前 4 匹马最少需要比几次;
▲ 14 实现快速排序
▲ 14 两数相加 II (Leetcode 445)
▲ 12 搜索旋转排序数组 (Leetcode)
▲ 12 判断有环链表的环长度 (Leetcode)
▲ 12 旋转数组的最小数字 (Leetcode)
▲ 11 最大子序和 (Leetcode)
▲ 11 给定一个 foo 函数,60%的概率返回0,40%的概率返回1,如何利用 foo 函数实现一个 50% 返回 0 的函数?
▲ 11 搜索旋转排序数组 II (Leetcode)
▲ 10 K 个一组翻转链表 (Leetcode 25)
▲ 9 最长连续子序列 (Leetcode)
▲ 9 二叉树的最近公共祖先 (Leetcode 236)
▲ 8 最小栈 (Leetcode)
▲ 8 丑数 II (Leetcode 264)
▲ 8 路径总和 (Leetcode)
▲ 8 二叉树的锯齿形层次遍历 (Leetcode)
▲ 7 旋转数组 (Leetcode)
▲ 16 简述 vector 的实现原理
vector
▲ 11 简述 C++ 中智能指针的特点,简述 new 与 malloc 的区别
首先,new/delete是C++的关键字,而malloc/free是C语言的库函数,后者使用必须指明申请内存空间的大小,对于类类型的对象,后者不会调用构造函数和析构函数
▲ 10 简述 C++ 编译的过程
对于C++源文件,从文本到可执行文件一般需要四个过程:
预处理阶段:对源代码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,生成预编译文件。
编译阶段:将经过预处理后的预编译文件转换成特定汇编代码,生成汇编文件
汇编阶段:将编译阶段生成的汇编文件转化成机器码,生成可重定位目标文件
链接阶段:将多个目标文件及所需要的库连接成最终的可执行目标文件
▲ 3 C++ 中虚函数与纯虚函数的区别
▲ 2 C++ 中什么是菱形继承问题?
菱形继承
▲1 C++ 的 vector 和 list中,如果删除末尾的元素,其指针和迭代器如何变化?若删除的是中间的元素呢?
▲ 1 C++ 的重载和重写是如何实现的?
区别
▲ 36 进程和线程之间有什么区别?
▲ 18 进程间有哪些通信方式?
▲ 17 简述几个常用的 Linux 命令以及他们的功能。
▲ 13 线程有多少种状态,状态之间如何转换
▲ 11 进程有多少种状态?
▲ 7 简述 socket 中 select 与 epoll 的使用场景以及区别,epoll 中水平触发以及边缘触发有什么不同?
▲ 5 Linux 下如何排查 CPU 以及 内存占用过多?
▲ 3 进程通信中的管道实现原理是什么?
▲ 3 Linux 下如何查看 CPU 荷载,正在运行的进程,某个端口对应的进程?
▲ 2 如何调试服务器内存占用过高的问题?
▲ 2 Linux 如何查看实时的滚动日志?
▲ 35 简述 TCP 三次握手以及四次挥手的流程。为什么需要三次握手以及四次挥手?
▲ 34 HTTP 与 HTTPS 有哪些区别?
▲ 24 TCP 与 UDP 在网络协议中的哪一层,他们之间有什么区别?
▲ 21 一次 HTTP 的请求过程中发生了什么?
▲ 19 TCP 中常见的拥塞控制算法有哪些?
▲ 15 DNS 查询服务器的基本流程是什么?DNS 劫持是什么?
▲ 11 Cookie和Session的关系和区别是什么?
▲ 7 TCP 怎么保证可靠传输?
▲ 4 TCP 中 SYN 攻击是什么?如何防止?
▲ 2 TCP 四次挥手的时候 CLOSE_WAIT 的话怎么处理?
▲ 2 简述 WebSocket 是如何进行传输的
▲ 33 10亿个数中如何高效地找到最大的一个数以及最大的第 K 个数
▲ 19 两个 10G 大小包含 URL 数据的文件,最多使用 1G 内存,将这两个文件合并,并找到相同的 URL
▲ 15 二叉树的层序遍历
▲ 12 常用的排序方式有哪些,时间复杂度是多少?
▲ 12 用 Rand7() 实现 Rand10() (Leetcode)
▲ 11 使用递归及非递归两种方式实现快速排序
▲ 10 实现 LRU 算法,实现带有过期时间的 LRU 算法
▲ 10 如何随机生成不重复的 10个100 以内的数字?
▲ 9 二叉树的最近公共祖先 (Leetcode 236)
▲ 7 如何实现大数运算
▲ 4 反转链表 (Leetcode)
▲ 3 用栈实现队列 (Leetcode)
▲ 2 1000台 机器,每台机器 1000个 文件,每个文件存储了 10亿个 整数,如何找到其中最小的 1000个 值?
▲ 1 两个文件包含无序的数字,数字的大小范围是0-500w左右。如何求两个文件中的重复的数据?
▲ 1 最长公共子序列 (Leetcode)
▲ 1 链表倒数第K个数 (Leetcode)
▲ 1 按序打印 (Leetcode)
▲ 16 C++ 中智能指针和指针的区别是什么?
▲ 15 简述 C++ 右值引用与转移语义
▲ 14 简述 vector 的实现原理
▲ 14 简述 C++ 中智能指针的特点,简述 new 与 malloc 的区别
▲ 13 C++ 11 有什么新特性
▲ 11 STL 中 vector 与 list 具体是怎么实现的?常见操作的时间复杂度是多少?
▲ 7 编译时链接有几种方式?静态链接和动态链接的区别是什么?
▲ 5 深拷贝与浅拷贝区别是什么?
▲ 3 类默认的构造函数是什么?
▲ 2 const、static 关键字有什么区别
▲ 2 只定义析构函数,会自动生成哪些构造函数?
▲ 1 简述 C++ 中内存对齐的使用场景
▲ 1 简述 C++ 从代码到可执行二进制文件的过程
▲ 1 简述 STL 中的 map 的实现原理
▲ 34 进程和线程之间有什么区别?
▲ 29 进程间有哪些通信方式?
▲ 27 简述 socket 中 select 与 epoll 的使用场景以及区别,epoll 中水平触发以及边缘触发有什么不同?
▲ 26 Linux 进程调度中有哪些常见算法以及策略?
▲ 18 操作系统如何申请以及管理内存的?
▲ 12 简单介绍进程调度的算法
▲ 11 简述 Linux 系统态与用户态,什么时候会进入系统态?
▲ 11 简述 LRU 算法及其实现方式
▲ 11 线程间有哪些通信方式?
▲ 8 简述同步与异步的区别,阻塞与非阻塞的区别
▲ 8 简述操作系统如何进行内存管理
▲ 7 简述操作系统中的缺页中断
▲ 3 简述操作系统中 malloc 的实现原理
▲ 2 BIO、NIO 有什么区别?怎么判断写文件时 Buffer 已经写满?简述 Linux 的 IO模型
▲ 1 进程空间从高位到低位都有些什么?
▲ 41 简述 TCP 三次握手以及四次挥手的流程。为什么需要三次握手以及四次挥手?
▲ 32 RestFul 与 RPC 的区别是什么?RestFul 的优点在哪里?
▲ 29 HTTP 与 HTTPS 有哪些区别?
▲ 26 RestFul 是什么?RestFul 请求的 URL 有什么特点?
▲ 23 一次 HTTP 的请求过程中发生了什么?
▲ 19 TCP 与 UDP 在网络协议中的哪一层,他们之间有什么区别?
▲ 18 TCP 中常见的拥塞控制算法有哪些?
▲ 17 TCP 怎么保证可靠传输?
▲ 17 从系统层面上,UDP如何保证尽量可靠?
▲ 8 TCP 的 keepalive 了解吗?说一说它和 http 的 keepalive 的区别?
▲ 8 简述 TCP 滑动窗口以及重传机制
▲ 8 简述 HTTP 1.0,1.1,2.0 的主要区别
▲ 7 简述 TCP 的 TIME_WAIT
▲ 5 HTTP 的方法有哪些?
▲ 4 简述 TCP 协议的延迟 ACK 和累计应答
▲ 1 简述 TCP 的报文头部结构
▲ 1 简述 TCP 半连接发生场景
▲ 1 什么是 SYN flood,如何防止这类攻击?
#算法
▲29 10亿个数中如何高效地找到最大的一个数以及最大的第 K 个数
▲ 21 最大子序和 (Leetcode)
▲ 20 爬楼梯 (Leetcode)
▲ 18 用 Rand7() 实现 Rand10() (Leetcode)
▲ 15 AVL 树和红黑树有什么区别?
▲ 15 给定一个包含 40亿 个无符号整数的大型文件,使用最多 1G 内存,对此文件进行排序
▲ 14 合并两个有序链表 (Leetcode)
▲ 14 路径总和 (Leetcode)
▲ 14 如果通过一个不均匀的硬币得到公平的结果?
▲ 13 实现快速排序
▲ 13 数组中的第 K 个最大元素 (Leetcode)
▲ 13 10亿条数据包括 id,上线时间,下线时间,请绘制每一秒在线人数的曲线图
▲ 13 删除排序链表中的重复元素 (Leetcode)
▲ 11 有序链表插入的时间复杂度是多少?
▲ 10 Hash 表常见操作的时间复杂度是多少?遇到 Hash 冲突是如何解决的?
▲ 9 环形链表 (Leetcode)
▲ 6 常用的限流算法有哪些?简述令牌桶算法原理
▲ 4 简述常见的负载均衡算法
▲ 1 反转链表 (Leetcode)
▲ 1 第一个只出现一次的字符 (Leetcode)
腾讯
▲ 14 对加班有什么看法?
▲ 10 你的优势和劣势是什么?
▲ 7 与同事沟通的时候,如果遇到冲突了如何解决?
▲ 1 最近一年内遇到的最有挑战的事情是什么?
阿里
▲ 21 最近阅读哪些技术书籍,遇到技术问题是怎么去解决?
▲ 9 与同事沟通的时候,如果遇到冲突了如何解决?
▲ 8 你的优势和劣势是什么?
▲ 2 团队合作沟通中遇到过什么问题?
▲ 1 简单描述一下自己是怎么样的人?
▲ 1 为什么要离开现在的公司?
▲ 1 目前为止,坚持得最久一件事情是什么?
字节
▲ 6 项目中最难的地方是哪里?你学习到了什么?
虾皮
▲ 7 你对 Shopee 了解多少?你选择 Shopee 的原因是什么?
▲ 1 你的老师和同学是如何评价你的?
▲ 1 最近在看什么书以及技术文章?
美团
▲ 11 下一份工作希望学习到什么?
▲ 11 项目中最难的地方是哪里?你学习到了什么?
▲ 9 团队合作沟通中遇到过什么问题?
▲ 9 最近在看什么书吗,有没有接触过什么新技术?
▲ 5 成长过程中影响你最深的事件和人