本文共 10206 字,大约阅读时间需要 34 分钟。
1.关键字static作用,函数加static和不加static区别
首先回答出加上static为静态变量或静态函数
然后回答在C语言中static的作用,使得变量或者函数的生存周期为整个源程序
接着回答C++类中 static 修饰的变量或函数为整个类共有,即可。
2.const关键字作用,const和宏定义有什么区别,用哪个?(宏定义太多会导致代码膨胀)
首先回答const关键词修饰代表只读,read only,意味着该变量里的数据只能被访问,而不能被修改。
const和宏定义的区别
define宏是在预处理阶段展开。
const常量是编译运行阶段使用。
define宏没有类型,不做任何类型检查,仅仅是展开。
const常量有具体的类型,在编译阶段会执行类型检查。
在C++ 中使用const
3.虚函数是如何实现的?
需要答出虚函数表与虚函数指针
C++中虚函数使用虚函数表和虚函数表指针实现,虚函数表是一个类的虚函数的地址表,用于索引类本身以及父类的虚函数的地址,假如子类重写了父类的虚函数,则对应在虚函数表中会把对应的虚函数替换为子类的函数的地址(子类中可以不是虚函数,但是必须同名);虚函数表指针存在于每个对象中(通常出于效率考虑,会放在对象的开始地址处),它指向对象所在类的虚函数表的地址;在多继承环境下,会存在多个虚函数表指针,分别指向对应不同基类的虚函数表。
4.线程和进程的区别,线程如何实现同步和通信,进程如何实现通信?
进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。
线程:是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。
简单的说,一个程序就是一个进程, 线程是进程的一个执行单元
进程线程的区别:
一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程
简单的说,同一个进程的线程共享进程的地址空间, 共享堆空间, 栈空间独立,进程资源完全是独立的。一个线程崩溃,其他线程会受到影响,进程是独立的。
【3】线程间如何通信
1、全局变量2、自定义消息3、std::promise std::feture4、IO完成端口
【4】进程间如何通信
1、管道(匿名管道和有名管道)2、消息队列3、共享内存4、信号量5、套接字
5.了解哪些线程模型?
6.手写二叉树中序遍历递归和非递归。
递归遍历简单,非递归有难度
7.socket如何进行通信?
借助TCP或UDP协议进行通信
8.poll,select,epoll区别。
三个函数均是IO多路复用函数,委托内核取监听IO事件
1)select==>时间复杂度O(n)
它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。
1)select==>时间复杂度O(n)
它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。
(3)epoll==>时间复杂度O(1)
epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1))
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。
epoll跟select都能提供多路I/O复用的解决方案。在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则应该是POSIX所规定,一般操作系统均有实现
9.TCP四次挥手。
1.快排代码
熟练写出对称形式的以第一个下标为key的快排, 先不用随机交换优化第一个数
2.在矩阵中左上角到右下角总步数
可以用标准的排列组合方法和dp方式做出来
3.sizeof(1==1)?(c++ 1字节,c 4字节)
C++ 中是一个bool类型,C语言是一个int类型
4.sizeof(结构体)
考察内存对齐。
5.分糖果思路,n个小孩围城一个圈,每个小孩都有一个分数,老师希望尽量少的把糖果分给小孩们,如果某小孩的分数比周围的高,那么糖果数也要比他们高。
分糖果问题,见代码面试指南
6.c是c++的子集吗?不是
7.gpu为何要分block
8.c和c++区别
1.判断链表是否有环
通过快慢指针(一个一次走两步,一个一次走一步)判断是否,有环,在绕一圈,求出环的长度n,然后再用快慢指针(先移动n步),两个指针必然再环入口上相遇到。可以求出环的入口
2.网络体系结构,并详细介绍
OSI七层模型
3.linux操作系统包含哪些部分
一般有4个主要部分:内核、shell、文件系统和应用程序。
4.对称和非对称加密,md5对称,md5不可逆
对称加密
对称加密算法又称传统加密算法。
加密和解密使用同一个密钥。加密解密过程:明文->密钥加密->密文,密文->密钥解密->明文。
1. 对称加密算法又称现代加密算法。
2. 非对称加密是计算机通信安全的基石,保证了加密数据不会被破解。 3. 非对称加密算法需要两个密钥:公开密钥(publickey) 和私有密(privatekey) 4. 公开密钥和私有密钥是一对如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密。
如果用私有密钥对数据进行加密,只有用对应的公开密钥才能解密。公钥加密私钥解密, 私钥加密公钥解密
MD5是哈希散列算法,对于MD5而言,有两个特性是很重要的,第一:明文数据经过散列以后的值是定长的;第二:是任意一段明文数据,经过散列以后,其结果必须永远是不变的。前者的意思是可能存在有两段明文散列以后得到相同的结果。
5.char和varchar区别
数据库SQL语言中,char的长度是不可变的,而varchar的长度是可变的
k问题
partition和堆来处理
7.数据库索引
8.linux常用指令
随便说几个
9.项目数据库设计
10.缓存策略为什么用fifo
11.为啥要有缓存策略
12.http和https的区别
HTTPS和HTTP的区别主要如下:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
关键是答出 http是明文传输, https是密文传输,
以下是具体一些分析
13.http状态码有哪些
200 – 请求成功
301 – 资源(网页等)被永久转移到其它URL
404 – 请求的资源(网页等)不存在
500 – 内部服务器错误
一面:
1.虚函数如何实现的
虚函数表和虚函数指针
2.虚函数前面加static行不行
不行
3.两个有序数组找第N大,二分
合并找返回第N个,时间复杂度为O(N), 空间复杂度为O(N)
4.两个有序数组找相同的数
5.netstat命令
Linux netstat命令用于显示网络状态。
利用netstat指令可让你得知整个Linux系统的网络情况。
6.三次握手画图
7.四次握手为什么要等2msl
1、为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。
2、他还可以防止已失效的报文段。客户端在发送最后一个ACK之后,再经过经过2MSL,就可以使本链接持续时间内所产生的所有报文段都从网络中消失。从保证在关闭连接后不会有还在网络中滞留的报文段去骚扰服务器。
注意:在服务器发送了FIN-ACK之后,会立即启动超时重传计时器。客户端在发送最后一个ACK之后会立即启动时间等待计时器。
8.tcp flag字段有哪些
9.vector如何删除偶数,保证迭代器不失效
注意,不能直接遍历删除,因为当删除后迭代器会失效,返回值为下一个迭代器,下面的代码是正确的方法
{ std::vector vec = {1,2,3,4,5,6,7,8,9}; auto itr = vec.begin(); while (itr != vec.end()) { if (*itr % 2) { itr = vec.erase(itr); } else { itr++; } }//done}
10.为什么析构函数要加虚函数
在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。
三面:
1.智能指针
C++ STL四种智能指针
2.路由器和交换机的区别
3.深拷贝和浅拷贝区别
浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝(例:assign())
深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝
4.快排时间复杂度,为什么
NlogN, logN个子问题,每个子问题需要O(N)的时间复杂度
5.map实现查询的时间复杂度
log(N), 底层是红黑树
6.客户端突然没电关机,服务器怎么知道
(1)使用定时器(适合有数据流动的情况)。
(2)使用socket选项SO_KEEPALIVE(适合没有数据流动的情况)。方法1:应用层自己实现的心跳包。
方法2:TCP协议的KeepAlive保活机制。
7.ttl作用
一面
1.一个母串,如何判断一些字串在母串中出现的位置和次数
KMP字符串匹配算法
2.一个母串,判断这些字串能否拼接成这个母串
模拟一遍
3.https如何实现安全的,具体
4.栈和堆的存储空间,如何在一个函数通过调用地址修改另一个函数的临时变量
5.tcp和udp可以用同一个端口吗
可以
6.bgp协议的具体属性
边界网关协议(BGP)是运行于 TCP 上的一种的。
7.socket和描述符说一下
Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。
Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。
调用Socket函数时,socket执行体将建立一个Socket,实际上 “建立一个Socket” 意味着为一个Socket数据结构分配存储空间。 Socket执行体为你管理描述符表。
8.大端和小端
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中
一面:
1.进程和线程区别,进程优势
进程的优点是独立,一个进程错误,不会影响另一个进程
2.进程通信方法,什么时候用有名管道,共享内存如何实现
3.环形打印矩阵
常见算法题,直接考虑用O(N^2)的算法写
4.地址分配,内存地址如何访问内存条上面的物理地址
5.四次挥手,为什么四次吗,第二次和第三次之间叫什么名字,四次结束后2MSL叫什么名字,为甚要等2MSL
4 次 挥手:确保数据能够完成传输,但关闭连接 时,当收到对方的 FIN 报文通知时,它
仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以 未必会马上会关闭 SOCKET, 也即你可能还需要发送一些数据给对方之后,再发送 FIN 报文 给对方来表示你同意现在可以关闭连接了,所以它这里的 ACK 报文和 FIN 报文多数情况下 都是分开发送的为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认
6.数据库事务,如何防止多个事务同时操作同一个数据,具体
7.LFU实现
8.分苹果问题,如何从任意几个箱子拿出苹果能够凑齐一个整数
1.strcpy实现代码
实现strcpy
2.awk知道吗
linux awk命令
3.linux哪个命令知道多少客户端连接服务器的数量
netstat
5.linux下如何查看磁盘空间
df:列出文件系统的整体磁盘使用量;
du:评估文件系统的磁盘使用量(常用于评估目录所占容量)
df参数:
-a:列出所有的文件系统,包括系统特有的/proc等文件系统
-k:以KB的容量显示各文件系统
-m:以MB的容量显示各文件系统
-h:以人们较易阅读的GB,MB,KB等格式自行显示
-H:以M=1000K替代M=1024K的进位方式
-T:连同该分区的文件系统名称(例如ext3)也列出
-i:不用硬盘容量,而以inode的数量来显示
2.hashmap底层是如何解决冲突的
3.hash解决冲突的方法有哪些
将hash值相同,key不同的元素以Entry<V,V>的方式存放在链表中,这样就解决了hash冲突,这种方法叫做分离链表法,与之类似的方法还有一种叫做 开放定址法
开放地址法有线性探查,平方探查和再Hash方法
4.指针和引用的区别
引用是别名,指针是地址,具体的:
5.析构函数可以是虚函数吗?为什么
可以,基类的虚构函数必须设为虚函数,为了用基类指针调用派生类时能执行派生类的析构函数
6.构造函数可以是虚函数吗?为什么
不能,再创建对象时就要执行构造函数,不能动态绑定
7.vector,list各自优缺点
vector:
优点:
随机存取,即[]操作和vector.at() 动态操作,push_back()与pop_back() 自动调整内存,节省空间 缺点: 实现插入与删除操作效率低 只能在尾部插入与删除,在头部插入与删除消耗时间规模与容器大小成正比。 当动态添加的数据超过默认内存大小时,要进行整体的重新分配,拷贝与释放。list:
优点:内存不连续动态操作,插入与删除效率高可在两端进行pop,push缺点:不能随机访问相对于vector占用内存多
8.vi的保存退出命令是什么
:wq
9.树都有哪些结构以及应用场景
红黑树,B+数, map,set
5.new和malloc区别,以及free的时候如何知道释放的内存是多大
new是一个关键字,malloc是一个函数,malloc返回值无类型,
new的时候会执行构造函数
new不需要指明分配的大小
系统在分配内存时除了分配指定的内存空间外,还有分配用于保存内存空间大小等信息。所以内存释放时不再需要再指定释放多大的内存空间,只需要指定该块内存空间的首地址即可。
58
一面:1.c和c++区别
2.指针和引用
3.重载和继承
重载是指的函数名相同,函数参数不同
4.多态如何实现
虚函数,虚函数表,虚函数表指针
5.static
6.volatile
7.三次握手
8.http和socket
9.写数据库建立索引语句
10.数据库事务以及四大特性
11.linux常用指令
12.100w个数中查找重复次数最多的前100个
分开Hash,再合并
13.树的应用
set,map
14.进程通信有哪些
15.长连接和短连接以及http是长连接还是短连接
在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等,每遇到这样一个Web资源,就会建立一个HTTP会话。
从HTTP/1.1起,默认使用的是长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入:Connection:keep-alive。在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。实现HTTP长连接必须要客户端和服务端都支持。
二面:
1.0123实现三个数字的全排列,非递归实现
2.stl底层实现
3.排序,什么时候用堆排序比较好
4.队列和栈的应用情况
稳定排序
5.手写sql语句
6.netstat receive n和send n方法
一面:
1.两个循环数组如何判断有序
2.如何查看某个数字二进制有多少个1
剑指offer编程题
3.三次握手和四次挥手
4.虚析构函数
5.虚继承和钻石继承,如果不是虚继承会报什么错误
6.topn问题
7.快排时间复杂度和思想
二面:
n个球,每个球上都有一个数字,判断能否取得四个球使得这四个球上的数字之和等于某个数。
四数之和问题?暴力作时间复杂度O(N^4), 可以优化
一面:
1.整数在计算机里面是怎么存储的?补码还是源码?正数和负数的区别
4字节32个位二进制,负数是补码
2.数据库索引什么情况适合建立什么情况不适合建立?什么情况建立索引也不起作用
3.select和epoll的区别,触发模式有哪些?分别在什么场景下使用
epoll和select都是I/O多路复用的技术,都可以实现同时监听多个I/O事件的状态
epoll相比select效率更高,主要是基于其操作系统支持的I/O事件通知机制,而select是基于轮询机制
水平触发和边缘触发
4.告诉你停车场中心坐标,如何判断一辆汽车进入了停车场
假设是一个大圆,计算判断
5.从上海到北京的地铁上如何查看周围的酒店
6.无锁的线程队列如何设计
7.线程之间的状态转换
8.数据库隔离性如何实现
二面:
1.做的项目内存如何管理
2.100g数据内存10g如何排序
一面:
1.讲项目
2.sqrt(double x),精度是a^-x,写代码
二分搜所或牛顿迭代,
3.1000瓶毒药,小白鼠可以尝试,每只小白鼠只能用一次,如何使用尽量少的小白鼠才能知道毒药在哪一瓶?
智力题
二面:
1.讲项目
2.矩阵顺时针旋转90度
Leetcode经典问题,分两步,
第一步:先将矩阵以次对角线互换 (如果是逆时针则为主对角线)
第二步:交换第i行到第n-1-i行一面:
1.3次握手4次挥手
2.进程线程区别
3.topk问题
4.内存泄漏情况
5.编译执行生成的文件
二面:
1.滑动窗口
2.重传机制
3.topk问题,手写代码
三面:
1.有序数组,截成两段,重新拼接,求被截的位置
2.static关键字,一个类写在.h里面,如何初始化static修饰的
3.构造函数初始化列表
初始化顺序?
4.手写拷贝复制函数
5.手写vector删除元素的代码
6.智能指针
7.stl
8.多态
9.两个有序链表合并代码
10.红黑树特点
11.写一下多态,什么情况下函数里面的参数变量不一样也能实现多态
一面:
1.手写匹配字符串代码
kmp?还是O(N^2)
2.三次握手四次挥手
3.虚函数,多态
4.构造函数可以是虚函数吗?
不可以
5.STL
6.存储在堆里面的数据和栈里面的哪个快?为什么
7.c和c++区别
8.c++如何引用c文件
二面:
1.cpu的组成部分
2.地址管理
3.bfs和dfs
4.STL
5.归并排序
6.如何防止类被继承
7.智能指针
8.红黑树特点
9.什么是右值
三面:
1.最近看的书籍
2.window内存管理和linux内存管理区别
3.高并发项目做过没有
4.慢启动
5.ipv4和ipv6区别,ipv4转到ipv6有什么困难
一面
二面
一面
二面
三面
一面
二面
总结: 需要牢记常考语法, 算法题,数据结构,网络,操作系统理论与linux, 还有部分数据库,智力题可以通过面试。