菜鸟笔记
提升您的技术认知

面试题

实现一个LRU Cache 算法LRU Cache C++三种解法java实现LRU算法及编码实现LRU策略缓存LRU算法常见缓存算法和LRU的c++实现设计循环双端队列(deque)LRU 缓存结构 (c++ 哈希双链表实现)LRU缓存机制删除单链表中的指定节点Linux 内核经典面试题拼多多社招面经:Redis是重点,讲一讲redis的内存模型线程、进程、协程的区别C++经典面试题面试官:我们只想要这样的C++工程师Linux C/C++ 学习路线链表操作汇总C++11的智能指针面试题浏览器中输入url后发生的事情常用的限流算法HTTP协议和HTTPS协议面试题网络编程面试题目总结c++后台面试题目如何实现LRU算法?如何寻找无序数组中的第K大元素?布隆过滤器 - 如何在100个亿URL中快速判断某URL是否存在?如何实现大整数相加?C++面试题及基本知识点总结C++给定出栈序列判定是否合法消息队列面试题要点redis缓存击穿,失效以及热点key解决方案网页在浏览器上的渲染过程几种限流算法lru算法例题C/C++常见面试知识点总结附面试真题----20210529更新引入MQ消息队列的作用及其优缺点MySQL面试篇社招三年后端面试题60道测开面试题,背完直接涨工资二叉树的层序遍历(两种方法实现)Bitmap 海量数据处理字符串倒序输出的五种方法C语言 输入10个数,统计出并输出正数、负数和0的个数字节三面:如何设计一个高并发系统架构,网络 面试36问,DDos攻击原理C++线程池使用 C++11 编写可复用多线程任务池

c++后台面试题目

阅读 : 1813
  1. 实现快速排序算法,排序算法有哪几种?
int *quickSort(int *arr,int left,int right)
{
  
	if(left < right)
	{
  
		int mid = partion(arr,left,right);
		arr = quickSort(arr,left,mid - 1);
		arr = quickSort(arr,mid + 1,right);
	}
	return arr;
}
int partion(int*arr,int left,int right)
{
  
	int mid = arr[left];
	int i = left + 1;
	int j = right;
	while(true){
  
		while(i<=j && arr[i] <= mid) i++;
		while(i<=j && arr[j] >= mid) j--;
		if(i >= j)
			break;
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
	arr[left] = arr[j];
	arr[j] = mid;
	return j;
}

排序算法还要冒泡排序插入排序希尔排序选择排序、堆排序、归并排序、桶排序、计数排序。
2. 线程池的有点和缺点?
优点:线程是一种珍贵的资源,使用线程池可以减少创建和销毁线程的次数,减少了反复创建和销毁线程的消耗;可以调整线程池中工作线程的数量,防止因为消耗过多,导致服务器崩溃;多线程可以大大提高cpu的利用率,快速响应,可以同时处理多个任务。
缺点:使用线程池也存在很大风险,多个线程共享资源,就会存在资源竞争的情况,为了保护资源而加锁,可能导致线程死锁;多个线程同时操作临界区资源,如果操作是非原子的,会导致数据产生不可预知的错误;如果线程池比较大,也会大量消耗系统资源,线程之间的切换也会浪费时间。
3. C++ STL迭代器的概念,为什么采用迭代器?
C++迭代器是为了方便的访问同一种数据类型的指针,对于连续存贮的数据,指针可以遍历存贮空间,但对于非连续的存贮数据,也需要寻找一个类似的指针类,来对数据结构进行遍历。迭代器是一种检查容器内元素并遍历元素的数据类型。迭代器是指针的泛化,它允许程序员用相同的方式处理不同的数据类型。
3. 并发和并行的区别。
并发是并行的一个子集。并发指的是,在某一个时间段内,cpu可以同时处理多个任务,但在实际执行上是多个任务交替执行,所以看上去是同时执行。而并行是真正的同时发生,这种情况就是一定发生在多核的cpu上,多个任务可以不受彼此影响的同时执行。并发和并行都可以极大提高cpu的执行效率,充分利用cpu的资源,提高系统的处理性能。
4. 线程之间通信的方法。
通过消息队列的方式,通过自定义数据结构,可以循环数复杂和简单的数据结构;利用系统提供的事件信号通知机制,通过使用同步锁和自定义数据结构来实现;使用管道来实现,管道可以实现线程和进程间通信;利用系统套接字的方式,通过tcp、udp来实现。
5. 线程和进程之间的区别和联系。
区别:是系统进行资源分配和调度的基本单位,是操作系统结构的基础;线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。进程拥有自己独立的地址空间,并且不同的进程相互之间不受影响;同一个进程的所有线程共享进程的地址空间,他们之间不相互独立,资源存在相互竞争。
联系:线程是进程的组成部分,一个程序至少有一个进程,一个进程至少有一个线程。
6. 进程之间是如何通信的。
匿名管道:速度慢,容量有限,只有父子进程能通信;命名管道:任何进程都能通信,但是速度慢;消息队列:容量受到限制,且要注意第一次读的时候,要考虑上一次没有读完的数据的问题;信号量:不能传递复杂的消息,只能用来同步;共享内存:能够很容易控制容量,速度快,但是需要保持同步。
7. 静态多态和动态多态。
静态多态指的的函数的重载,一般是编译器在编译期间完成;动态多态是在运行时根据基类的指针指向的对象来确定具体调用哪个函数,这一般是虚函数,派生类对基类的重写。动态多态缺陷,降低了程序运行效率(多态需要去找虚表的地址),空间浪费(需要创建虚表,浪费空间)。
8. 动态库和静态库的区别。
静态链接库:静态链接库在编译的时候直接编译到目标程序中,会编译成比较大的文件,但是编译成功的可执行文件可以独立运行,不需要向外部求取函数库的内容,但是升级不方便;
动态链接库:动态函数库在编译的时候,在程序里只有一个“指向”的位置,当可执行文件需要用到具体函数时,再去库中找对应的函数。他的最大优点就是提高了程序的兼容性和可扩展性,方便动态的加载各种程序模块。
9. 算法的空间复杂度和时间复杂度。
算法的时间复杂度就是算法的时间量度,记作:T(n) = O(fn(n))。它表示随这问题规模n的增大,算法的执行时间的增长率和f(n)的增长率相同,称作算法的时间复杂度,常见的时间复杂度有常数阶(O(1))、线性阶(O(n))、对数阶(O(logn))、平方阶(O(n^2))等;算法的空间复杂度是指该算法所耗费的存储空间,它也是问题规模n的函数。从用户使用的体验看,更看重程序的执行的速度,一些缓存产品和算法本质就是空间换时间。
10. Linux下的编译和调试。
gcc是linux系统集成的编译器,gcc [options] file1 file2…,对于c++代码可以直接换为g++即可。通过全局变量指定额外的编译参数export CXXFLAGS="-std=c++11" ,export CFLAGS="-std=c99"。Linux系统下的调试采用GDB,它既能在反汇编过程中充当一件称手的工具,也能在程序debug过程中为为程序员提供帮助,其唯一美中不足的是在Linux环境下没有图像界面。为了更好的使用gdb的调试功能,在编译程序时需加入 -g 选项,gdb a.out //使用gdb对a.out进行调试。另外,在使用gdb进行调试过程中,可能免不了需要重新编译程序,这时不必将gdb退出,只需待程序重新编译后使用 r 指令重新运行程序,gdb会自动更新程序状态,这样可以节约时间。
11. cmake和Makefile的应用。