美团一面--后台开发

美团一面

感受

虽然挂了,但是感觉是自己的原因,太菜。美团其实问的并不过分,自己有很多东西没有复习到,之前一直想着TCP/IP是肯定要被问的,http只是了解了一下没有仔细琢磨,http就翻车了,问到什么是无状态时,我回答的是TCP的连接一次请求一次建立,太蠢了!所以问完这个问题直接结束了。问到死锁问题时,让我在在线编辑窗口中写一个死锁发生过程,具体的代码也没写出来,只是把过程用伪代码的形式写了一下,感觉他也没说什么。算法题的话这道题其实我是之前做过的,但是时间一长又给整完了,就连空间复杂度为O(n)的也没写出来,链表的操作个人感觉是要绕一点,算法题还是得多练以及多回顾。

在线编程题

92题反转链表

image-20220422162207475

思路:先找到需要翻转的链表,记录下翻转部分的前一个节点和后一个节点,将范围内的节点先翻转过来,翻转后再串联起来

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head == nullptr) {
            return head;
        }
        ListNode *cur_node, *next_node;
        cur_node = head->next;
        head->next = nullptr;
        while(cur_node) {
            next_node = cur_node->next;
            cur_node->next = head;
            head = cur_node;
            cur_node = next_node;
        }
        return head;
    }
    ListNode* reverseBetween(ListNode* head, int left, int right) {
        if(head == nullptr || head->next == nullptr) {
            return head;
        }
        ListNode dummp_node = ListNode{-1, 0};
        dummp_node.next = head;
        ListNode *pre_node, *left_node, *right_node, *after_node;
        pre_node = &dummp_node;
        for(int i = 0; i < left - 1; i++) {
            pre_node = pre_node->next;
        }
        left_node = pre_node->next;
        right_node = pre_node;
        for(int i = 0; i < right - left + 1; i++) {
            right_node = right_node->next;
        }
        after_node = right_node->next;

        pre_node->next = nullptr;
        right_node->next = nullptr;
        left_node = reverseList(left_node);
        pre_node->next = left_node;
        ListNode *temp = left_node;
        while(temp->next != nullptr) {
            temp = temp->next;

        }
        temp->next = after_node;
        return dummp_node.next;

    }
};

问题

介绍完美团业务之后,你有什么问题吗?

自我介绍?

你的职业规划是什么?

对于后台开发技术你是怎么学习的?

你的项目中最大的困难是什么,你是怎么解决的?

高并发和高可用是指什么?

高并发是指在一段时间内能够处理的任务数量,高可用是指服务器在遇到一些问题时可以继续提供服务,不会崩溃;

进程和线程的区别?

1.进程是资源分配的最小单位,线程是资源调度的最小单位
2.进程中可以包含一个或多个线程,线程共享进程中的公共资源,但是也有独有的资源,如寄存器和栈,寄存器保存一些指令信息,因为每个线程的执行状态是不一样的,需要记录程序执行的位置,栈保存每个线程的局部变量
3.进程与进程之间是独立的,而同一个进程的某一个线程崩溃的话,其他线程也会崩溃。
4.线程的创建、切换、销毁都要比进程消耗的时间短。
5.同一进程的线程间数据交互效率更好,因为共享进程的资源,不需要经过内核。

进程间通信方式?(我提到了信号量)

1.匿名管道(针对父子进程情况)
2.命名管道
3.信号量
4.队列
5.共享内存
6.socket

信号量是怎么实现进程间通信的?

信号量一般是和共享内存搭配起来一起实现进程间的通信,因为在使用共享内存的过程中,会涉及在同一时间多个进程对共享内存进行读写操作,信号量保证了进程间通信的互斥和同步。

死锁问题是什么,你可以写出来死锁的demo吗?

假设有两个线程A,B,两个锁mutex_A, mutex_B,在A线程执行过程中先尝试获得mutex_A,再获得mutex_B, 而在B线程执行过程中先尝试获得mutex_B,再获得mutex_A,这样A,B分别拿到了mutex_B, mutex_A,一直等待下一个锁,进入死锁状态;

死锁问题该怎么解决?

就上个例子而言,将获得锁的顺序一致就可以;都是先获得mutex_A, 再获得mutex_B;

TCP和UDP介绍一下?

TCP是面向连接的、可靠的、基于字节流的传输层通信协议,UDP是无连接的。

TCP是怎么实现可靠传输的?

1.ACK响应机制
2.同步序列号保证数据包顺序

TCP的流量控制和拥塞控制介绍一下?

流量控制只与接收端的缓存区大小有关,是通过滑动窗口实现的,是指在不考虑网络的情况下接受段可以接受的数据大小;
拥塞控制与网络情况有关,通过拥塞窗口来实现,在滑动窗口内根据网络拥塞情况调整。拥塞窗口的调整过程有慢启动、拥塞避免、超时重传/快速重传,
1.在慢启动阶段,拥塞窗口起始值为1,每收到一个ACK,将窗口值加1,是一个指数增长过程。
2.窗口值大于ssthresh门限值时,进入拥塞避免阶段,窗口每次增加1,线性增长
3.窗口不可能一直增加下去,当出现超时时(收不到ACK),进入超时重传,ssthresh设置为当前窗口大小的一半,窗口值设置为1。
4.如果是收到3个连续的ACK说明网络环境还可以,只是一些莫名其妙的原因丢了一个包,进入快速重传阶段,当前窗口值;ssthresh = cwnd / 2;cwnd = ssthresh + 3(这个3是指收到了3个ACK);再次进入拥塞避免,线性增加窗口大小。

HTTP协议了解吗,为什么说他是无状态协议?

HTTP是超文本传输协议,无状态是指服务器不会去记录HTTP状态,如果需要完成一些关联性操作时比较麻烦。但是可以使用cookie技术来解决;

你还有什么想问的吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值