2020阿里后端面试题整理(含答案)

关于epoll和select的区别,哪些说法是正确的?

  • 【A】epoll和select都是I/O多路复用的技术,都可以实现同时监听多个I/O事件的状态。

  • 【B】epoll相比select效率更高,主要是基于其操作系统支持的I/O事件通知机制,而select是基于轮询机制。

  • 【C】epoll支持水平触发和边沿触发两种模式。

  • 【D】select能并行支持I/O比较小,且无法修改。

答案:ABC

从innodb的索引结构分析,为什么索引的key长度不能太长?

key 太长会导致一个页当中能够存放的 key 的数目变少,间接导致索引树的页数目变多,索引层次增加,从而影响整体查询变更的效率。

MySQL的数据如何恢复到任意时间点?

恢复到任意时间点以定时的做全量备份,以及备份增量的 binlog 日志为前提。恢复到任意时间点首先将全量备份恢复之后,再此基础上回放增加的 binlog 直至指定的时间点。

输入 ping IP 后敲回车,发包前会发生什么?

首先根据目标IP和路由表决定走哪个网卡,再根据网卡的子网掩码地址判断目的IP是否在子网内。如果不在则会通过ARP缓存查询IP的网卡地址,不存在的话会通过广播询问目的IP的mac地址,得到后就开始发包了,同时mac地址也会被ARP缓存起来。

请解释下为什么鹿晗发布恋情的时候,微博系统会崩溃,如何解决?

《 参考思路 》

  • 获取微博通过 pull 方式还是 push 方式
  • 发布微博的频率要远小于阅读微博
  • 流量明星的发微博,和普通博主要区分对待,比如在 sharding 的时候,也要考虑这个因素

现有一批邮件需要发送给订阅顾客,且有一个集群(集群的节点数不定,会动态扩容缩容)来负责具体的邮件发送任务,如何让系统尽快地完成发送?请详述技术方案!

  • A. 借助消息中间件,通过发布者订阅者模式来进行任务分配
  • B. master-slave 部署,由 master 来分配任务
  • C. 不借助任何中间件,且所有节点均等。通过数据库的updatereturning,从而实现节点之间任务的互斥

有一批气象观测站,现需要获取这些站点的观测数据,并存储到 Hive 中。但是气象局只提供了 api 查询,每次只能查询单个观测点。那么如果能够方便快速地获取到所有的观测点的数据?

  • A. 通过 shell 或 python 等调用 api,结果先暂存本地,最后将本地文件上传到 Hive 中。
  • B. 通过 datax 的 httpReader 和 hdfsWriter 插件,从而获取所需的数据。
  • C. 比较理想的回答,是在计算引擎的 UDF 中调用查询 api,执行UDF 的查询结果存储到对应的表中。一方面,不需要同步任务的导出导入;另一方面,计算引擎的分布式框架天生提供了分布式、容错、并发等特性。

给定一个链表,删除链表的倒数第 N 个节点,并且返回链表的头结点。

给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的。 要求: 只允许对链表进行一次遍历。

参考答案

我们可以使用两个指针而不是一个指针。第一个指针从列表的开头向前移动 n+1n+1 步,而第二个指针将从列表的开头出发。现在,这两个指针被 nn 个结点分开。我们通过同时移动两个指针向前来保持这个恒定的间隔,直到第一个指针到达最后一个结点。此时第二个指针将指向从最后一个结点数起的第 nn 个结点。我们重新链接第二个指针所引用的结点的 next 指针指向该结点的下下个结点。

代码示例 :
public ListNode removeNthFromEnd(ListNode head, int n)
{
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode first = dummy;
ListNode second = dummy;
// Advances first pointer so that the gap between first
and second is n nodes apart
for (int i = 1; i <= n + 1; i++) {
first = first.next;
}
// Move first to the end, maintaining the gap
while (first != null) {
first = first.next;
second = second.next;
}
second.next = second.next.next;
return dummy.next;
}

复杂度分析: 时间复杂度:O(L),该算法对含有 L 个结点的列表进行了一次 遍历。因此时间复杂度为 O(L)。 空间复杂度:O(1),我们只用了常量级的额外空间。

假如给你一个新产品,你将从哪些方面来保障它的质量?

可以从代码开发、测试保障、线上质量三个方面来保障。在代码开发阶段,有单元测试、代码Review、静态代码扫描等;测试保障阶段,有功能测试、性能测试、高可用测试、稳定性测试、兼容性测试等;在线上质量方面,有灰度发布、紧急回滚、故障演练、线上监控和巡检等。

请评估一下程序的执行结果?


public class SynchronousQueueQuiz {
    public static void main(String[] args) throws Exception {
        BlockingQueue<Integer> queue = new
        SynchronousQueue<>();
        System. out .print(queue.offer(1) + " ");
        System. out .print(queue.offer(2) + " ");
        System. out .print(queue.offer(3) + " ");
        System. out .print(queue.take() + " ");
        System. out .println(queue.size());
    }
}

A. true true true 1 3 B. true true true (阻塞) C. false false false null 0 D. false false false (阻塞)

参考答案 D