2021-秋招-提前批-美团-移动端-一面面经

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、介绍项目

你可能感兴趣的:(2021秋招面经,面试)