拼多多暑期实习笔试分享
免责声明:以下内容是我语音输入,让我的 ChatGPT 总结整理的题解思路,仅做简单复盘分享,可能存在理解偏差。
下面先给出四道题 相对标准化的题干描述。
如果你只是想练习,可以先只看题干部分,不要往下翻题解。
题目一:主播排序
给定 N 个直播片段,每个片段包含以下信息:
- uid:主播编号
- A:指标 A(越大越好)
- B:指标 B(越大越好)
- T:时间(越早越好)
- index:输入顺序(越早越好)
排序规则如下:
- A 越大越好
- 若 A 相同,则 B 越大越好
- 若 A,B 相同,则 T 越早越好
- 若 A,B,T 都相同,则 index 越小越好
现在需要:
- 对于每个主播,只保留其 最优的一个直播片段
- 使用每个主播的最优片段对 主播进行排序
- 有 Q 个查询,每个查询给出一个直播片段编号 x
输出规则:
- 如果 x 不是该主播的最优片段,输出 0
- 如果 x 是该主播的最优片段,输出该主播的排名
题目二:电动车充电最小费用
一辆电动车需要行驶总距离 L。
给定:
- 电池容量 C(最多能行驶 C 公里)
- 路上有若干充电站
- 每个充电站包含:位置 x每公里电量价格 p
电动车每行驶 1 公里消耗 1 单位电量。
车辆可以在任意充电站购买电量,但电池容量不能超过 C。
目标:
求从起点到终点的最小花费。
如果无法到达终点,输出 -1。
题目三:删除子串达到目标位置
给定一个长度为 N 的字符串 S,字符集合为:
U D L R
分别表示二维平面上的四个方向移动。
从 (0,0) 出发,根据字符串进行移动。
现在允许执行一次操作:
删除一个连续子串(也可以不删除)。
给定目标坐标 (tx, ty)。
问题:
是否可以通过删除一个连续子串,使得最终位置变为 (tx, ty)。
(某些版本题目可能要求输出最短删除长度。)
题目四:资源包容量最小化
给定两个数组:
A[i] = 第 i 个时段的需求 B[i] = 第 i 个时段的原始容量
系统允许使用最多 M 个资源包。
每个资源包具有:
- 容量 x
- 持续 W 个时段
如果在某个时段开启资源包,则该资源包会影响区间:
[i , i+W-1]
目标:
找到 最小资源包容量 x,使得所有时段满足:
B[i] + 资源包贡献 ≥ A[i]
如果存在解:
输出:
最小资源包容量 x 使用的资源包数量
如果不存在解,输出 -1。
题解部分(以下开始剧透)
题目一题解
这题本质是 分组取最优 + 多维排序。
第一步,遍历所有直播片段,对每个主播维护一个当前最优片段。
比较规则完全按照题目给定的排序规则。
第二步,每个主播只保留这个最优片段。
把所有主播的最优片段拿出来,再按同样的排序规则排序。
第三步,排序完成后即可得到主播排名。
处理查询时:
- 如果查询片段不是该主播最优片段,输出 0
- 如果是最优片段,输出该主播排名
整体思路就是:
每组取代表元素 → 用代表元素排序 → 查询时判断是否为代表元素。
题目二题解
这题是经典的 贪心问题(最小加油费用模型)。
在某个充电站 i 时,需要决定买多少电。
关键观察:
只需要看 电池可达范围内是否存在更便宜的充电站。
如果在当前站点可达范围内存在一个更便宜的站点:
- 只需要买 刚好能到达该站点的电量
如果在可达范围内没有更便宜的站:
- 在当前站 充满电池
然后一路模拟到终点即可。
关键点在于:
寻找的是“第一个更便宜的站”,而不是范围内最低价的站。
题目三题解
这题可以转化为 子数组和问题。
设整条路径的位移为:
S
目标位移为:
T
如果删除的子串位移为:
sub
则删除后剩余路径满足:
S - sub = T
整理得到:
sub = S - T
因此问题转化为:
是否存在一个连续子串,其位移等于 S - T。
可以使用 前缀和 + 哈希表:
- pre[i] 表示前 i 个字符的位移
- 子串 [l+1 ... i] 的位移为 pre[i] - pre[l]
遍历 i 时检查是否存在某个 l 使得:
pre[i] - pre[l] = target
如果存在,则说明可以删除该子串。
题目四题解
这题是典型的 二分答案 + 贪心判定。
首先观察到:
如果某个资源包容量 x 可以满足需求,那么任何更大的 x 也一定可以满足。
因此可以 二分最小的可行 x。
关键是实现判定函数 check(x)。
从左到右扫描每个时段,维护当前资源包带来的总容量贡献。
如果在某个时段:
B[i] + 当前贡献 < A[i]
说明容量不足,需要新开资源包。
设缺口为:
need = A[i] - (B[i] + 当前贡献)
每个资源包贡献 x,因此需要开:
ceil(need / x)
个资源包。
这些资源包会影响接下来 W 个时段,因此可以用 差分数组 来维护贡献范围。
扫描过程中统计使用资源包总数,如果超过 M,则当前 x 不可行。
通过二分搜索找到最小可行 x 即可。
总结
四道题分别对应四个经典算法模型:
主播排序 | 分组取最优 + 多维排序 |
电动车充电 | 贪心 |
删除子串路径 | 前缀和 + 哈希 |
资源包容量 | 二分答案 + 贪心 |
整体特点是:
- 模型识别比复杂实现更重要
- 题目本身算法难度不高,但需要快速抽象问题结构
