使用说明:本贴总结了面试高频问题总结网站和高频面试题的解答博文,选择标准是清晰易懂的高赞博文 ,暂时只面向粉丝,内容会不断填充
祝大家度过愉快的学习时间~
以后每次面试前尽量都复习一遍
说明:
以后端/服务端开发方向面试题全解析网站为主线,如果有此网站中没有包括到的内容或其他面试中遇到的扩展内容,补充在此处。
使用指南:
- 打开后端/服务端开发方向面试题全解析
- 不懂的地方翻此处的扩展部分,如果有缺漏则补上。
[关于测评]
[面试高频问题网站] (总结型)
后端/服务端开发方向面试题全解析
牛客C++岗位面试真题宝典
小林coding
2021年后端开发面试题整理合集
名企面试100题系列
程序员面试、算法研究、编程艺术、红黑树、机器学习5大系列集锦
以下问题为上述总结链接中问题的补充
[算法]
1.LRU和LFU算法的实现
2.雪花算法
3.八大排序算法的原理图解及代码实现
冒泡排序
最好情况时间复杂度o(n):最佳情况下
public void bubbleSort(int arr[]) {
boolean didSwap;
for(int i = 0, len = arr.length; i < len - 1; i++) {
didSwap = false;
for(int j = 0; j < len - i - 1; j++) {
if(arr[j + 1] < arr[j]) {
swap(arr, j, j + 1);
didSwap = true;
}
}
if(didSwap == false)
return;
}
加入了交换标志didSwap,i=0第一遍遍历,进行n-1次比较,因为数组本身正序不会进行任何一次交换,那么第一遍遍历完交换标志didSwap依然为false,算法直接返回结束。
只进行一次遍历,n-1次比较,算法就结束,显然冒泡排序最佳情况的时间复杂度是O(n)。
快速排序
最优的情况:
如下图,最优情况下,每次找到的参考轴把数据分成均匀的两半,最后应该是一个平衡二叉树状态;二叉树的层数(logn)即为递归需要进行的次数,并且每轮递归结束时,都将二叉树遍历了一遍(n),所以最优的情况下,时间复杂度为O(nlogn)
最坏情形:
最坏情形下,为正序或逆序排列,二叉树画出来应该是一棵斜树,并且需要经过n-1次递归调用才能完成,且第i次划分需要经过n‐i次关键字的比较才能找到第i个记录,也就是枢轴的位置,最终的时间复杂度应该O(n2)
空间复杂度
空间的消耗主要是递归造成的栈空间使用,最好情况,递归树的深度为log2n,其空间复杂度也就为O(logn),最坏情况,需要进行n‐1递归调用,其空间复杂度为O(n),平均情况,空间复杂度也为O(logn)。
快速排序——寻找数组第K大数(由浅入深,四种方法对比讲解!)
[C++问题]
1.C++11智能指针
2. C++内存泄漏及解决方法 、内存泄漏及其检测方法
检查内存泄漏1:valgrind工具
valgrind --tool=memcheck ./main
检查内存泄漏2:CRT
#define CRTDBG_MAP_ALLOC //放在程序最前
#include <iostream>
#include <crtdbg.h>
using namespace std;
int main()
{
_CrtDumpMemoryLeaks(); //放在程序最后
return 0;
}
3.C/C++语言中的NULL等于0吗????C++中NULL和nullptr的区别
4.左值和右值、面试题:什么是右值引用?右值引用与左值引用的区别
左值(Lvalue) →→ Location
表示内存中可以寻址,可以给它赋值(const类型的变量例外)
右值Rvalue) →→ Read
表示可以知道它的值(例如常数)
什么是左值引用呢?
左值引用,就是绑定到左值的引用,通过&来获得左值引用。
那么,什么是左值呢?
左值,就是在内存有确定存储地址、有变量名,表达式结束依然存在的值。
什么是右值引用呢?
右值引用,就是绑定到右值的引用,通过&&来获得右值引用。
那么,什么又是右值呢?
右值,就是在内存没有确定存储地址、没有变量名,表达式结束就会销毁的值。
非常量左值引用只能绑定到非常量左值上;常量左值引用可以绑定到非常量左值、常量左值、非常量右值、常量右值等所有的值类型。
非常量右值引用只能绑定到非常量右值上;常量右值引用可以绑定到非常量右值、常量右值上。
即对应非常量引用只能绑定到对应值上,且常量>非常量
5.map底层、unorder_map底层,二者区别,为什么这样设计
参考:http://c.biancheng.net/view/6560.html
set,queue的底层数据结构和逻辑,上述中查找元素的时间复杂度,是否有序
6.十一、从头到尾解析Hash表算法
7.教你初步了解红黑树
8.C++编译到exe的步骤
#pragma 用于设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma 所定义的很多指示字是编译器特有的,在不同的编译器间是不可移植的。1.#pragma once 保证头文件只被编译一次 2.#pragma warning 只对当前文件有效(对于.h,对包含它的cpp也是有效的) ex: #pragma warning(disable:XXXX) //禁用警告
#pragma warning(enable:XXXX) //启用警告
9.静态链接与动态链接的区别 、静态链接库和动态链接库的使用场景
10.手写shared_ptr智能指针
11.C/C++面试:手写智能指针类
12.shared_ptr 的引用计数为什么必须 new 出来?
下面的例子说明了原因:
std::shared_ptr<std::string> p1(new std::string("Hiya!"));
std::shared_ptr<std::string> p2(p1);
std::shared_ptr<std::string> p3(p1);
引用计数器不能直接作为 std::shared_ptr 对象的 data member ,如果引用计数保存在每个对象中,当创建p3时我们应该如何正确更新它呢?可以递增p1中的计数器并将其拷贝到p3中,但如何更新p2中的计数器呢? 同时也不能以 static data member 保存引用计数,那样就会导致 std::shared_ptr 类的所有对象共享一份引用计数了,尤其当通过 std::shared_ptr 定义出两个无关的对象时,它们却在共享同一份引用计数,这样显然是存在问题的。解决此问题的一种方法是将计数器保存在动态内存中。当创建一个对象时,我们也动态分配一个新的计数器。当拷贝或赋值对象时,我们拷贝指向计数器的指针。使用这种方法,副本和原对象都会指向相同的计数器。
链接:https://www.zhihu.com/question/54676447/answer/2293338084
13.C++11:lambda表达式详细介绍
14.C++内存模型
简介: (1) 堆(heap)
堆,编译器不用去管,可以使用new和malloc来申请内存,但必须在不使用的时候使用delete和free释放掉。
(2) 栈(stack)
栈中存放着局部变量,函数参数。
(3) 静态存储区
主要存储全局静态变量,局部静态变量,全局变量,以及虚函数表
(4) 常量存储区
这个区主要保存什么东西呢?全局常量,函数指针,常量数组 。函数指针实际上就是常量指针
(5) 代码区
就是存放代码的地方,这个就不多说,实际上就是一个只读的区域,和常量区一样,只是这个区域的指针可以执行而已。
也有一说把C++内存模型五区分成堆区、栈区、自由存储区、全局/静态存储区、常量存储区。
但是有个问题,自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。C语言使用malloc从堆上分配内存,缺省的全局运算符new和delete也许会按照malloc和free的方式来被实现,这时藉由new运算符分配的对象,说它在堆上也对,说它在自由存储区上也正确。那么自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。
因此,个人认为采用成堆区、栈区、静态存储区、常量存储区、代码区的分类方式更合适。
15.C++ memset初始化对象注意点
16.c/c++能做什么?主要应用是什么
c/c++是一种通用的编程语言,广泛用于系统软件与应用软件的开发。语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程序设计中备受青睐,成为最近25年使用最为广泛的编程语言。
当前,C语言编译器普遍存在于各种不同的操作系统中,例如Microsoft Windows、macOS、Linux、Unix等。C语言的设计影响了众多后来的编程语言,例如C++、Objective-C、Java、C#等。
1、桌面前端岗位,一般要求要懂Qt
2、一般服务器后端岗位,asio、libevent等,一般要求懂socket、多线程编程等知识点,偏linux
3、游戏服务器后端岗位,在一般服务器后端岗位的基础上还要懂几个游戏相关的库,偏linux
4、图形引擎岗位,引擎开发类的,不熟悉需求技能
5、机器学习、算法等研究性岗位,一般来说对语言要求不高,C++/GO/JAVA懂其一,但是数据结构、算法等能力要求极高
6、智能家居等嵌入式开发岗位,一般来说对C的要求大于C++,要求对ICPins定义、中断结构、状态机设计、通讯总线设计等技能
7、图形图像处理、音视频处理后端岗位,一般要求ffmpeg、H264、H265、opencv等其他岗位的话,用C++的不是很常见了…
17.C++ 拆分字符串为单词的五种方法
18.小心stringstream.str()字符串用法的陷阱
[操作系统 \ Linux编程]
1.同步、异步;阻塞、非阻塞;epoll是同步还是异步?
同步、异步
并发模式中的同步和异步:
同步指的是程序完全按照代码序列的顺序执行
异步指的是程序的执行需要由系统事件驱动
阻塞、非阻塞
阻塞是指调用线程或者进程被操作系统挂起。
非阻塞是指调用线程或者进程不会被操作系统挂起。
epoll是同步还是异步
从IO层面来看,epoll绝对是同步的;
从消息处理层面来看,epoll是异步的.
2. 进程、线程、协程
进程、线程、协程、goroutine区别
协程运行在线程之上,当一个协程执行完成后,可以选择主动让出,让另一个协程运行在当前线程之上。协程并没有增加线程数量,只是在线程的基础之上通过分时复用的方式运行多个协程,而且协程的切换在用户态完成,切换的代价比线程从用户态到内核态的代价小很多。
3.多线程和多进程 及其应用场景
4.Linux的用户空间与内核空间
5.内核态和用户态的区别
6.自己趟过epoll的坑
7.详解内存对齐
8.栈空间和堆空间大小、内存分配空间中的堆区和栈区的区别
代码段:存放可执行文件的操作指令,只读
数据段:用来存放可执行文件中已初始化全局变量,存放静态变量和全局变量
BSS段:用来存未初始化的全局变量
栈区:用来存临时创建的局部变量
堆区:用来存动态分配的内存段
C++ 的内存区域分布:全局/静态存储区、常量数据区、堆区、栈区、自由存储区。全局变量和静态变量(包括全局静态变量和局部静态变量)存储在全局/静态存储区,常量数据区存放字符串常量、虚函数表(Linux 下)。栈区存储局部变量、函数参数等,堆区和自由存储区存放程序动态开辟的内存空间。
9.在1G内存的计算机中能否malloc(1.2G)?为什么?
10.条件变量详细解说
11.linux查看进程所有子进程和线程
Linux 下查看一个进程的所有线程的命令是:top -H -p pid、pstree -p、ps -T
12.Linux和Windows中线程和进程的区别
13.操作系统之进程和线程(二者的区别,进程的状态切换、创建、终止、上下文切换)
14.读写磁盘IO流程
[计算机网络]
TCP、UDP、Socket、HTTP面试题(总结最全面的面试题!!!)
学完计算机网络,秋招稳的一笔
1.什么是TCP粘包?怎么解决这个问题
2.Cookie和Session的区别(面试必备)
3.GET和POST两种基本请求方法的区别
4.TCP连接占用的资源
5.三次握手与Socket API
6.TCP和HTTP请求之间的关系
[MySQL面试题部分]
MySQL 使用方法简单教程
15000 字的 SQL 语句大全,值得收藏!
招银面试官,听说你精通 MySQL,我们来大战 66 回合
后端/服务端开发方向面试题全解析MySQL部分
MySql面试题(总结最全面的面试题!!!)
1.关系型数据库和非关系型数据库的特性以及各自的优缺点
2.为什么实际开发中不使用外键
3.为什么说B树和B+树的每个节点对应一个磁盘页,IO操作最坏的情况下是树的高度?
4.MySQL索引可以分为哪些类型?
5.什么是幻读?以及如何解决幻读问题?(来自mysql45讲)
6.看完你就应该能明白的悲观锁和乐观锁
7.看完你就应该能明白的自旋锁
8.面试官:一千万数据,怎么快速查询?
[设计模式]
设计模式
1.软件设计七大原则
2.一句话归纳设计模式
3.设计模式面试题(总结最全面的面试题!!!)
[Linux基本命令]
Linux必备基本命令(Linux学习笔录-2)
linux常用命令总结(一)
linux下快速查找文件
[综合面经]
0.(全剧终)C/C++ 与 嵌入式软件开发招聘记录(华为、中兴、联发科、海康、大华、oppo、vivo、地平线、科大讯飞、广联达、绿盟、CVTE、诺瓦等)
1.2022 力扣春招征文|0402 腾讯 光子工作室后台开发一面
2.知乎_牛奶_面经
3.OPPO技术岗面经汇总:软件研发、硬件开发…
4.面试复盘 | 竞技世界 提前批(已OC)
5.中望C++软件开发
6.秋招面经分享,嵌入式c/c++,多家公司可内推
[项目相关问题]
1.web服务器项目部分问题汇总
2.Tinywebserver——服务器常问面试题!
3.【面试专栏】自己整理的WebServer项目问题
4.WebServer服务器项目可能会被问到的问题(一)
5.自己趟过epoll的坑
6.C++中的RAII机制
7.最新版Web服务器项目详解 - 13 踩坑和面试题
8.半同步/半异步模式,半同步半反应堆reactor模式
貌似事件模式和并发模型的分类有点重复,搞清基础就成,别陷太深。
[必备扩展知识]
C语言内存精讲,让你彻底明白C语言的运行机制!
C static struct
[海量数据处理面试题]
1.海量数据处理
2.从一千万条短信中找出重复次数最多的前10条
实际应用题
1.超卖问题及其解决方法
[查缺补漏思维导图]
查缺补漏思维导图(来源:一位在字节的后端开发童鞋)
只截图了算法部分
需要熟知的代码
1.单例模式(饿汉模式)
直接定义静态对象,单例类定义的时候就进行实例化。因为main函数执行之前,全局作用域的类成员静态变量m_Instance已经初始化,故没有多线程的问题。
class Singleton
{
//why static: if without static, createobject() can only be used through specific object which means a specific object needs to be built previously
// but object can only be built through createobject() function (cause it's Singleton)
public:
static Singleton& GetInstance();
private:
Singleton(){}
Singleton(const Singleton&);
Singleton& operator= (const Singleton&);
private:
static Singleton m_Instance;
};
//CPP文件
Singleton Singleton::m_Instance;//类外定义-不要忘记写
Singleton& Singleton::GetInstance()
{
return m_Instance;
}
//Singleton& instance = Singleton::GetInstance();
int main(){
Singleton& instance = Singleton::GetInstance();//函数调用
//why not Singleton* : if return a pointer of Singleton,users may try to delete obj,but obj is a build by (static Singleton m_Instance;) ,not new m_Instance.
//
return 0;
}