1、算法题:用两个栈实现一个队列
本题看起来很简单,实际上也并不复杂,但其实还是有点考验思维,我们知道栈的特点是先进后出,队列的特点是先进先出,为了实现队列,我们可以使用两个栈,具体操作如下
1、push时,向stack1中push
2、pop时,我们需要将stack1中的元素压入stack2以调换顺序,但不能简单的每次pop时直接将stack1中的元素都压进stack2,考虑如下场景:[“PSH1”,“PSH2”,“POP”,“PSH3”,POP"],
如果简单按照之前逻辑,输出就为1,3,但预期是1,2
这是因为pop时stack2中可能还有元素,直接那样做造成顺序的改变,所以我们在向stack2中压入元素时需要保证stack2为空,否则直接pop,等待stack2为空时再从stack1中一次性装入。
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
if(stack2.empty()){
while(!stack1.empty()){
stack2.push(stack1.top());
stack1.pop();
}
}
int res=stack2.top();
stack2.pop();
return res;
}
private:
stack<int> stack1;
stack<int> stack2;
};
基于本题,我们还可以扩展思考一下,如何用两个队列实现一个栈呢?大致类似,可以动手实现一下
接下来是几道八股文、等有时间了补上答案
2、介绍一下进程和线程
进程是操作系统为正在运行的程序进行的一种抽象
线程是进程划分为更小的运行单位,一个进程可以拥有多个线程,多个线程共享进程的堆和方法区
进程间切换:1.切换页目录以使用新的地址空间 2.切换内核栈和硬件上下文。
线程间切换:切换内核栈和硬件上下文
3、进程调度算法
先来先服务
短作业优先
优先级调度
时间片轮转
多级反馈队列
4、系统调用
用户态&&系统态
系统调用:设备管理、文件管理、内存管理、进程控制、进程通信
5、线程池
池化设计思想
1、预设资源、抵消每次获取资源的消耗:创建线程、获取远程连接等
2、线程复用
6、线程同步
互斥量
信号量
事件
7、设计模式
8、CPU使用率达到100%的时候会发生什么
9、代码是如何运行在机器上的
预处理->编译->汇编->链接
10、介绍项目