阿里2020实习生招聘笔试4月17日场题目解析

避开顺子

给定 1-n 的正整数,求其一个排列,使其不存在等差数列。 1 \leq n \leq 10^6

解析:

  • 如果三个正整数 a,b,c 形成等差数列, 2b = a+c ,显然 a,c 的奇偶性相同,且 a,c 在整个排列中应当位于 b 的左侧或者右侧( (a,c,b),(b,a,c),(c,a,b),(b,c,a) )。
  • 我们把数据分为奇数和偶数两部分,很显然 a,c 不能跨越两部分。只需要奇数和偶数也不满足等差数列即可。 对于偶数 x = 2m , 奇数 x = 2m + 1 ,对于m来说,又是一个从0开始的正整数序列。所以一次把 m 按照奇偶性再分开,依次递归下去。
  • 这个问题用分治方法就可以解决了,复杂度 O(n\text{log}n)

环路

给定一个环,有 n 个节点,点与点之间有一条无向边,第 i 条边连接第 i 个点和第 i+1 个点,边的权重为 A_i ,代表走这条边的时间花费。有一条边将被破坏,每一条边被破坏的概率相同。当前有 q 个人分别从各自的起点走到各自的终点,在边被破坏之前,大家都计划走最近的路线。破坏之后,有可能将不得不改道而行。现在求每一个人的时间花费有多大概率会变大。 2 \leq n ,q \leq 2*10^5, 1\leq A_i \leq 10^9

解析:

  • 一个人从起始点到终点只有两条路可以走,某一条的边数为 a ,另一条的边数就是 n-a ,这两条路被破坏的概率分别是 a/n (n-a)/n,一个人时间花费增大这个事件实际上需要比较边数为 a 的那条路的时间花费和边数 n-a 的时间花费哪个大。如果可以快速查询,我们就可以进行快速计算。
  • 我们只需要保存 \sum _{1}^{i}A_i 的前缀和数组即可快速查询 \sum_{i}^j A_i
  • 此图为无向图,起点和终点可以互换。
  • 算法复杂度 O(n)


以上非官方题解,仅个人见解,如果错误,欢迎大家指出!

淘宝技术部正在进行2020实习生招聘活动,长期招聘研究型实习生,欢迎大家踊跃投递简历,内推请发送简历到邮箱(yanjun.lxl@alibaba.com)

编辑于 2020-05-15 07:17