面经
文章平均质量分 77
Kuany_
这个作者很懒,什么都没留下…
展开
-
TCP通信过程中time_wait和close_wait产生过多的原因和解决方法
TCP通信过程中time_wait,和close_wait产生过多的原因和解决方法1. time_wait过多产生原因2.time_wait过多解决方法3.close_wait过多原因4.close_wait过多的解决方案1. time_wait过多产生原因 正常的TCP客户端连接在关闭后,会进入一个TIME_WAIT的状态,持续的时间一般在1-4分钟,对于连接数不高的场景,1-4分钟其实并不长,对系统也不会有什么影响, 但如果短时间内(例如1s内)进行大量的短连接,则可能出现这样一种情况:客户原创 2020-09-17 18:10:19 · 16706 阅读 · 1 评论 -
给定一个无序数组,求第K大的数,要求不能使用额外的空间,时间复杂度尽量低
给定一个无序数组,求第K大的数,要求不能使用额外的空间,时间复杂度尽量低今天快手面试,面试官问我对各种排序算法了解吗,我说了解,然后他给我出了一道题,给定一个无序数组,求第K大的数,要求不能使用额外的空间,时间复杂度尽量低,当时有点懵…我能想到的只能是用数组滚动遍历一遍,时间复杂度为O(n),空间复杂度也O(n)…或者排序再遍历,实在想不出,面试官给了一个思路:使用分治和快排的思想,这才恍然大悟。贴上代码:#include <bits/stdc++.h>using namespace原创 2020-09-14 23:52:04 · 628 阅读 · 0 评论 -
关于判断递归的时间复杂度总结
关于判断递归的时间复杂度总结若每次递归使问题的规模减半,而其他操作都是常数时间T(N)=T(N/2)+O(1), 则T(N)=O(logN)若每次递归使用问题的规模减1,而其他操作是常数时间T(N)=T(N-1)+O(1),则T(N)=O(N)若每次递归使问题的规模减半,而其他操作是线性时间T(N) = T(N/2)+O(N),则T(N)=O(NlogN)...原创 2020-09-11 15:11:37 · 1423 阅读 · 0 评论 -
leetcode面试题 16.25. LRU缓存——LRU最近最少使用算法
leetcode面试题 16.25. LRU缓存——LRU最近最少使用算法首先介绍下LRU LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。 因为我们是对缓存进行操作,那么久要求时间复杂度尽可能的低,那么我们就可以查找有无此key的时候用哈希表进行查找,原创 2020-09-07 13:49:13 · 661 阅读 · 0 评论 -
从labuladong东哥那里看到的位运算小技巧
从labuladong东哥那里看到的位运算小技巧1. 利用或操作 `|` 和`空格`将英文字符转换为小写2. 利用与操作 `&` 和`下划线`将英文字符转换为大写3. 利用异或操作 `^` 和`空格`进行英文字符大小写互换4. 判断两个数是否异号5. 不用临时变量交换两个数6. n&(n-1)用来消除数字 n 的二进制表示中的最后一个 17. 判断一个数是不是 2 的指数8. 查找只出现一次的元素9. n>>1表示n/2,n<<1表示n*2就不细说了说实话,最近做题原创 2020-08-23 17:52:03 · 1187 阅读 · 1 评论 -
Leetcode——二叉树的前序(第144题)、中序(94)、后序(145)、层序遍历(102)的递归和迭代写法总结
Leetcode——二叉树的前序(第144题)、中序(94)、后序(145)、层序遍历(102)的递归和迭代写法总结1. 给定一个二叉树,返回它的 前序 遍历。2. 给定一个二叉树,返回它的 中序 遍历。3. 给定一个二叉树,返回它的 后序 遍历。4. 给定一个二叉树,返回它的 层序 遍历。二叉树定义/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left;原创 2020-08-22 14:40:45 · 451 阅读 · 0 评论 -
C++两种情况实现简洁的死锁程序
C++实现简洁的死锁程序1.单线程对一个资源重复申请上锁的情况2. 两个线程对两个资源申请上锁,形成环路。1.单线程对一个资源重复申请上锁的情况#include <iostream>#include <thread>#include <mutex>#include <unistd.h>using namespace std;int data = 1;mutex mt1,mt2;void a2() { data = data * dat原创 2020-08-11 12:02:45 · 1612 阅读 · 1 评论 -
C++可重入函数和不可重入函数
C++可重入函数和不可重入函数可重入函数是指能够被多个线程“同时”调用的函数,并且能保证函数结果正确不必担心数据错误的函数。不可重入函数是指不能运行在多任务环境下,除非能保证互斥的函数。由于使用了未受保护的系统资源,如全局变量区,中断向量表等。不可重入函数在实时系统设计中被视为不安全函数。可重入函数特点:没有静态数据结构不返回指向静态数据的指针所有函数数据由函数的调用者提供使用auto变量,或通过全局变量的拷贝来保护全局变量若必须访问全局变量,则利用互斥信号保护不调用不可重入函原创 2020-08-09 21:38:02 · 1958 阅读 · 0 评论 -
C++11中的原子操作(atomic operation)和自旋锁
C++11中的原子操作(atomic operation)1. 原子操作2. 自旋锁3. 原子操作和使用互斥锁和自旋锁的速度对比1. 原子操作 所谓的原子操作,取的就是“原子是最小的、不可分割的最小个体”的意义,它表示在多个线程访问同一个全局资源的时候,能够确保所有其他的线程都不在同一时间内访问相同的资源。 我们在原子操作之前在多线程同步中防止发生数据竞争的操作是加互斥锁,但互斥锁是操作系统这一层级的,最终映射到CPU上也是一堆指令,是指令就必然会带来额外的开销;既然CPU指令是多线程不可再分的最原创 2020-08-09 21:11:29 · 3538 阅读 · 0 评论 -
进程和线程的概念和区别?进程和线程的使用场景?
进程和线程的概念和区别?进程和线程的使用场景?1. 进程2. 什么是线程3. 进行和线程之间的区别4. 进行和线程之间的相同点5. 进程和线程的使用场景1. 进程进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。2. 什么是线程线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位。一个进程可以由很多个线程组原创 2020-08-09 17:40:52 · 1400 阅读 · 0 评论 -
TCP流量控制、拥塞控制和重传机制详解
TCP流量控制、拥塞控制和重发机制(快重传和快恢复)详解1. TCP流量控制1.1 如何控制?1.2 发送方何时再继续发送数据?1.3 注意点:2. TCP拥塞控制2.1 拥塞控制的原理2.2 慢开始算法2.3 拥塞避免2.4 乘法减小和加法增大2.5 拥塞控制和流量控制的差别3. TCP重发机制(快重传和快恢复)3.1 快重传3.2 快恢复1. TCP流量控制如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,对发送方发送速率的控制,要原创 2020-08-09 16:13:04 · 2104 阅读 · 0 评论 -
HTTP和HTTPS一些注意点(区别、HTTPS通信过程、SSL/TLS的区别、HTTP1.0/1.1/2.0 的区别)
HTTP和HTTPS一些注意点(区别、HTTPS通行过程、SSL/TLS的区别、HTTP1.0/1.1/2.0 的区别)1. HTTP和HTTPS的区别2. HTTPS中整个 SSL/TLS 的握手和通信过程3. SSL/TLS的区别4.HTTP1.0/1.1/2.0 的区别1. HTTP和HTTPS的区别HTTPS 并不是一个新的应用层协议,它其实就是 HTTP + TLS/SSL 协议组合而成,而安全性的保证正是 TLS/SSL 所做的工作。也就是说,HTTPS 就是身披了一层 SSL 的 HTT原创 2020-08-09 14:10:08 · 1423 阅读 · 0 评论 -
HTTP长/短连接
HTTP长/短连接1. 什么是长/短连接2. 长短连接使用场景1. 什么是长/短连接在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。但从 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加原创 2020-08-09 14:06:10 · 462 阅读 · 0 评论 -
C++智能指针总结(面试常问)
C++智能指针总结(面试常问)1.智能指针的实现原理2. C++11四种智能指针总结2.1 auto_ptr:2.2 unique_ptr:2.3 share_ptr:2.4 weak_ptr:1.智能指针的实现原理智能指针的实现原理就是在一个类的内部封装了类对象的指针,然后在析构函数里对我们的类对象指针进行释放,因为类的析构是在类对象生命期结束时自动调用的,这样我们就省去了手动释放内存的操作,避免忘记手动释放导致的内存泄漏。2. C++11四种智能指针总结2.1 auto_ptr:1.auto_原创 2020-08-09 11:11:57 · 3280 阅读 · 1 评论 -
C++构造函数用初始化列表进行初始化和构造函数体内赋值进行初始化的区别?
C++构造函数用初始化列表进行初始化和构造函数体内赋值进行初始化的区别? 构造函数初始化列表和构造函数体最大的区别是初始化列表是初始化,而函数体内是赋值操作; 对于普通的数据类型两种操作只有资源消耗的区别。但引用和const常量都是不能被赋值的,它们在类内只能在构造函数的参数初始化列表中被初始化。对于对引用变量和const变量的初始化问题: 在进入构造函数体内时,实际上变量都已经初始化完毕了,即引用变量和const变量都已经用不确定的值初始化好了,构造函数内能做的只有赋值,而const类型和引原创 2020-07-29 00:34:09 · 682 阅读 · 0 评论 -
STL中迭代器的作用,有指针为何还要迭代器
STL中迭代器的作用,有指针为何还要迭代器 1. 迭代器2. 迭代器和指针的区别3. 迭代器产生原因1. 迭代器 Iterator(迭代器)模式又称Cursor(游标)模式,用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。或者这样说可能更容易理解:Iterator模式是运用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照一定顺序(由iterator提供的方法)访问聚合对象中的各个元素。 由于Iterator模式的以上特性:与聚合对原创 2020-07-28 23:25:51 · 547 阅读 · 0 评论 -
地址栏输入URL回车之后发生了什么?
地址栏输入URL回车之后发生了什么?首先,浏览器会根据你输入的 URL 地址,去查找域名是否被本地 DNS 缓存,不同浏览器对 DNS的设置不同,如果浏览器缓存了你想访问的 URL 地址,那就直接返回 ip。如果没有缓存你的 URL地址,浏览器就会发起系统调用来查询本机 hosts 文件是否有配置 ip 地址,如果找到,直接返回。如果找不到,就向网络中发起一个DNS 查询。在由根域名服务器 -> 顶级域名服务器 -> 权威 DNS 服务器后,由权威服务器告诉本地服务器目标 IP 地址,再有原创 2020-07-05 11:19:51 · 502 阅读 · 0 评论 -
C/C++虚函数和虚函数表概念及实现原理
C/C++虚函数和虚函数表概念及实现原理1. 概述2. 虚函数表构造过程3. 虚函数调用过程4. 多重继承1. 概述每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针。例:其中:B的虚函数表中存放着B::foo和B::bar两个函数指针。D的虚函数表中存放的既有继承自B的虚函数B::foo,又有重写(override)了基类虚函数B::bar的D::bar,还有新增的虚函数D::quz。2. 虚函数表构造过程从编原创 2020-07-02 17:20:53 · 852 阅读 · 0 评论 -
各种面经
各种面经STL之迭代器失效的情况C/C++什么是内存泄露,内存泄露如何避免?原创 2020-07-01 21:02:25 · 389 阅读 · 0 评论 -
STL之迭代器失效的情况
STL之迭代器失效的情况对于序列式容器(如`vector`,`deque`)对于关联容器(如`map`, `set`,`multimap`,`multiset`)迭代器失效分三种情况考虑,也是非三种数据结构考虑,分别为数组型,链表型,树型数据结构。数组型数据结构:该数据结构的元素是分配在连续的内存中,insert和erase操作,都会使得删除点和插入点之后的元素挪位置,所以,插入点和删除掉之后的迭代器全部失效,也就是说insert(*iter)(或erase(*iter)),然后再iter++,是没有原创 2020-05-20 18:09:34 · 503 阅读 · 0 评论 -
C/C++什么是内存泄露,内存泄露如何避免?
C/C++什么是内存泄露,内存泄露如何避免?1. 内存溢出2. 内存泄漏3. 造成内存泄露常见的三种情况3.1 指针重新赋值3.2 错误的内存释放3.3 返回值的不正确处理4. 如何避免内存泄露?5. 内存泄露检测工具valgrind1. 内存溢出 内存溢出 OOM (out of memory),是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个int,但给它存了long才能存下的数,那就是内存溢出。2. 内存泄漏 内存泄露 memory lea原创 2020-07-01 20:46:51 · 17575 阅读 · 2 评论