0914拼多多笔试复盘

#牛客AI配图神器#
1. 题目大意:
给定一个字符串,它是通过提取原字符串所有相邻的长度为2的子串并拼接而成。需要还原原始字符串。
解题思路:
加密过程是s1s2, s2s3, s3s4, ...拼接。解密时,第一个字符取s1,之后每隔一个字符取一个,即取第1, 3, 5, ...个字符。

2. 题目大意:
在n天内,每天有固定数量的项目可安排,但每天安排项目的成本不同。现有m个项目,每个项目都有一个最晚完成日期,求完成所有项目的最小总成本。
解题思路:
贪心。按天遍历,用大根堆维护当前可用的所有项目时段,堆顶为最高成本时段。每天新增x个时段,同时当天截止的项目数也增加。若总可用时段超过项目需求,就从堆中移除成本最高的时段。

3. 题目大意:
在一个数组中,找到有多少个连续子段,其元素之和等于子段的长度。
解题思路:
前缀和加哈希表。将条件S[r] - S[l-1] = r - l + 1变形为S[r] - r = S[l-1] - (l-1)。问题转化为寻找前缀和数组中,有多少对S[i]-i的值相等。用哈希表记录每个S[i]-i的出现次数即可。

4. 题目大意:
一个有n个分值的数组,可以任意排列。给定参数x, y,总得分为x倍数位置分值之和减去y倍数位置分值之和。求最大得分。
解题思路:
贪心。对数组排序。公式贡献可分为:净正(仅x倍数)、净负(仅y倍数)和零贡献(lcm(x,y)倍数)。计算出净正/负位置的数量,将最大的分值分配给净正位置,最小的分值分配给净负位置,其余随意。用前缀和优化查询。

#发面经攒人品#
全部评论
Arrays.sort(a); while (q-- > 0) { int x = in.nextInt(); int y = in.nextInt(); int sum1 = n / x; int sum2 = n / y; Set<Integer> set1 = new HashSet<>(); Set<Integer> set2 = new HashSet<>(); for (int i = 1; i <= sum1; i++) { set1.add(i * x); } for (int i = 1; i <= sum2; i++) { if (set1.contains(i * y)) { set1.remove(i * y); } else { set2.add(i * y); } } int count=0; for(int i=0;i<set1.size();i++){ count+=a[n-1-i]; } for(int i=0;i<set2.size();i++){ count-=a[i]; } 第四题这个为什么不对啊,举几个用例都是对的,但是通过0
点赞 回复 分享
发布于 09-14 16:04 湖南

相关推荐

09-14 11:48
门头沟学院 Java
想要offer的劳伦...:我2.75能进面试么?
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
评论
2
2
分享

创作者周榜

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