拼多多暑期实习笔试分享

免责声明:以下内容是我语音输入,让我的 ChatGPT 总结整理的题解思路,仅做简单复盘分享,可能存在理解偏差。

下面先给出四道题 相对标准化的题干描述

如果你只是想练习,可以先只看题干部分,不要往下翻题解。

题目一:主播排序

给定 N 个直播片段,每个片段包含以下信息:

  • uid:主播编号
  • A:指标 A(越大越好)
  • B:指标 B(越大越好)
  • T:时间(越早越好)
  • index:输入顺序(越早越好)

排序规则如下:

  1. A 越大越好
  2. 若 A 相同,则 B 越大越好
  3. 若 A,B 相同,则 T 越早越好
  4. 若 A,B,T 都相同,则 index 越小越好

现在需要:

  1. 对于每个主播,只保留其 最优的一个直播片段
  2. 使用每个主播的最优片段对 主播进行排序
  3. 有 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 即可。

总结

四道题分别对应四个经典算法模型:

主播排序

分组取最优 + 多维排序

电动车充电

贪心

删除子串路径

前缀和 + 哈希

资源包容量

二分答案 + 贪心

整体特点是:

  • 模型识别比复杂实现更重要
  • 题目本身算法难度不高,但需要快速抽象问题结构
#暑期##拼多多##笔试##拼多多集团-PDD笔试#
全部评论

相关推荐

今天 17:01
门头沟学院 Java
程序员大奋:不好意思,打扰大家🙏我是一个拼多多骑手,小电驴的最大电量为C😭😭😭需要从x=0处走到x=L处,途中有n个充电站,🙏🙏每个充电站的距离和电价分别为di和pi,初始电量是满的😭😭😭请告诉我到达终点最少要花多少钱😭😭😭求求大家把这些钱转给我
拼多多集团-PDD笔试
点赞 评论 收藏
分享
评论
3
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务