拼多多2021秋招笔试题
2020.09.01 19:00 开发岗编程笔试
拼多多的笔试题还是略难一点的(对比深信服),但比不上华为300分的题难度,华为的题分值是有梯度的(100、200、300),只需100分即可通过
第一题
将n*n矩阵分8个区域打印图形,从右上角逆时针标记对应区域的数字(1~8)
示例:
n=4
0 2 1 0
3 0 0 8
4 0 0 7
0 5 6 0
n=5:
0 2 0 1 0
3 0 0 0 8
0 0 0 0 0
4 0 0 0 7
0 5 0 6 0
思路:
区分这几组大小关系即可填入对应位置
- i与n/2
- j与n/2
- i与j
- i+j与n
第二题
n*m 01矩阵可以移动任意一个1,求移动后1的连通块最大大小
思路:
- 先dfs/bfs求每个连通块的大小
- 枚举所有节点0,判断周围4个方向相邻1个连通块个数是否为全部连通块的个数
- 若是 答案为:周围连通块大小之和
- 若否 答案为:周围连通块大小之和 + 1 (可以从其他连通块移动1填到此节点0)
第三题
01背包问题,n<200,V<5000。v[i]、c[i]可为负数,表示装入后总容量可增大/总价值会减少
- 滚动数组
通过60% - 对v[i]排序,将v[i]<=0,c[i]>=0先放入背包,更改背包容量
通过64% - 待解决
第四题
求1~N(N<1000000000) 内有多少个整数可以整除集合\(Y=\{Y_1,Y_2...Y_m\}(m\le 20)\)中某个元素
思路:容斥原理
注意到 1~N 内整除 x 的整数个数为 N/x,根据容斥原理,答案为
\[\sum {N \over Y_i} - \sum_{i\ne j} {N \over Y_i*Y_j} + \sum_{i\ne j,i\ne k,j\ne k} {N \over Y_i*Y_j*Y_k}- ...
\]
注意:Y集合首先要调整为全部元素互质的集合,即不存在 \(Y_i = k*Y_j\)