【后端开发面试高频问题】资源总结贴 (查缺补漏专用)

使用说明:本贴总结了面试高频问题总结网站和高频面试题的解答博文,选择标准是清晰易懂的高赞博文 ,暂时只面向粉丝,内容会不断填充
祝大家度过愉快的学习时间~

以后每次面试前尽量都复习一遍

说明:
后端/服务端开发方向面试题全解析网站为主线,如果有此网站中没有包括到的内容或其他面试中遇到的扩展内容,补充在此处。

使用指南:

  1. 打开后端/服务端开发方向面试题全解析
  2. 不懂的地方翻此处的扩展部分,如果有缺漏则补上。

[关于测评]

可以多看看测评笔试一点通
网站上偶尔看看题

[面试高频问题网站] (总结型)

后端/服务端开发方向面试题全解析
牛客C++岗位面试真题宝典
小林coding
2021年后端开发面试题整理合集
名企面试100题系列
程序员面试、算法研究、编程艺术、红黑树、机器学习5大系列集锦

以下问题为上述总结链接中问题的补充

[算法]

1.LRU和LFU算法的实现

146. LRU 缓存
460. 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智能指针

【C++】智能指针详解

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讲)

面试官一上来就问Mysql:幻读到底是什么?

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 面试题的内容通常包括刷题、Java中的原始类型和封装类、String、StringBuilder、StringBuffer的区别及使用场景、final关键字的用法、sleep()和wait()的区别等。刷题是面试前期准备过程中非常重要的一点,可以帮助面试者熟悉面试过程中可能会问到的知识点和高频题。\[1\]在Java中,int是原始类型,而Integer是Java为int提供的封装类,它们有不同的特征和用法,包括大小、速度和默认值。\[2\]String、StringBuilder和StringBuffer是Java中用于处理字符串的类,它们之间的区别在于可变性和线程安全性,适用的场景也有所不同。\[2\]final关键字可以用于修饰属性、方法和类,分别表示属性不可变、方法不可覆盖和类不可继承。而finally是异常处理语句结构的一部分,表示无论是否发生异常,都会执行其中的代码。finalize是Object类的一个方法,在垃圾回收执行时会调用被回收对象的此方法。\[3\]sleep()和wait()都可以用于线程的暂停,但它们的使用场景和效果不同。sleep()是Thread类的方法,用于暂停当前线程的执行一段时间,而wait()是Object类的方法,用于暂停当前线程的执行,同时释放对象的锁,直到其他线程调用notify()或notifyAll()方法唤醒它。\[3\]希望这些信息对你的面试准备有所帮助。 #### 引用[.reference_title] - *1* [2023年高频Java面试题集锦(含答案),让你的面试之路畅通无阻](https://blog.csdn.net/shy111111111/article/details/129317020)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [2023年Java最新面试题,附详解答案](https://blog.csdn.net/JasonXu94/article/details/130461350)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值