1.求数组中每个数字右边第一个比它大的数
使用单调栈,每当栈顶元素小于处理元素时,记录该值,循环到栈空;
否则继续入栈,直到数组末尾。
2.5种IO模型
Unix下的5种,前4种属于同步IO,第5种属于异步IO:
应用程序阻塞,直到数据拷贝完成
在等待数据时,应用程序轮询,CPU开销大
select阻塞应用程序,数据准备好后结束阻塞,然后才调用IO操作函数,select可管理多个套接字
在等待数据前建立SIGIO信号处理程序,不阻塞应用程序,数据准备好后收到信号,然后调用IO操作函数
整个过程都不阻塞,将任务交给内核处理,当数据拷贝完成后才通知应用程序处理数据
IO请求步骤:
存储介质→内核缓冲区(数据准备好)→用户缓冲区(数据拷贝完成)→应用程序处理数据
阻塞与非阻塞:进程线程是否需要进入阻塞状态(等待)
同步与异步:用户进程是否主动读写数据,前4种都需要将数据从内核缓冲区拷贝到用户缓冲区
select和poll、epoll的区别
3.操作系统为什么要分内核态和用户态
4.STL里resize和reserve的区别
5.lower_bound与upper_bound
#include
using namespace::std;
int main()
{
int n, a, tmp;
vector vec;
while (cin >> n >> a)
{
while (cin >> tmp)
vec.push_back(tmp);
int left = 0, right = n - 1;
while (left < right)
{
int mid = (left + right) >> 1;
if (vec[mid] < a)
{
left = mid + 1;
}
else
{
right = mid;
}
}
}
return 0;
}
6.C++11新特性
8.二叉树的持久化与层序遍历
用栈或者队列辅助
9.TCP与UDP区别
TCP四次握手
10.HTTP协议
https://www.jianshu.com/p/80e25cb1d81a
GET和POST区别:
11.hash_map
hash函数与桶
解决冲突:开放地址法(堆积)、拉链法(额外空间)、再散列法(计算时间)、公共溢出区
12.二叉树相距最远的两个节点的距离
情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点。
情况B: 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者
13.合并K个有序链表
最小堆(O(Nlog(K))
14.根据字典顺序返回1~N间的所有数
15.进程和线程的区别
进程是系统资源分配的最小单位,线程是CPU调度的最小单位
通信机制不一样:
16.操作系统堆栈空间的增长方向
通常来说,栈的地址比堆高,并且栈是向下增长的,堆是向上增长的,但是具体还要看操作系统怎么实现,堆其实是随机分配的内存管理机制
内存分区:BSS(未初始化的全局变量)、数据段(赋了初值的全局变量、常量、静态变量)、代码段、栈区、堆区
17.两个有序数组第K大的数
每次都删除一定在第 k 大元素之前的所有元素
18.洗牌算法
1.Fisher-Yates Shuffle算法 O(n*n) O(n)
从未处理的k个数的数组中,产生随机数p
2.Knuth-Durstenfeld Shuffle O(n) O(1)
从未处理的k个数的数组中,产生随机数p
缺点:必须知道数组长度,无法处理动态数组
3.Inside-Out Algorithm O(n) O(n)
反向Knuth-Durstenfeld,可处理动态数组
19.数组去重
标正负号,注意数组长度和数字范围
20.数组一个区间的和乘以这个区间最小值为S,求S最大值
使用向上递减单调栈,如果栈为空或入栈元素≥栈顶元素,则入栈;否则出栈
21.矩阵最长递增路径
22.最大连续子序列和
有O(n)解法,判断当前值+前面总和是否为负数
扩展:最大连续子序列乘积,考虑到负数,需要保存最小dp值和最大dp值
23.寻找无序数组第K大的数
24.new和malloc的区别
https://www.cnblogs.com/QG-whz/p/5140930.html
25.线程池设计
26.单例模式
1.饿汉式单例
方法调用前,实例就已经创建好了(多线程安全,但是无论是否使用都会创建)
class SingletonHungry
{
private:
SingletonHungry(){}
static SingletonHungry* singleton;
public:
static SingletonHungry* getInstance()
{
return singleton;
}
}
SingletonHungry* SingletonHungry::singleton = new SingletonHungry;
2.懒汉式单例
方法调用获取实例时才创建实例,不使用就不创建(多线程不安全,需要上锁+双重判断)
懒汉式单例如果要析构,需要定义嵌套类的析构函数释放单例,绝对不要直接在析构函数析构!!
class Singleton
{
private:
static Singleton* p;
Singleton(){pthread_mutex_init(&mutex);}
public:
static pthread_mutex_t mutex;
static Singleton* instance();
}
Singleton* Singleton::instance()
{
if (p == NULL)
{
pthread_mutex_lock(&mutex);
if (p == NULL)
{
p = new Singleton();
pthread_mutex_unlock(&mutex);
}
}
return p;
}
27.网络相关
28.多态与虚函数