京东笔试(离AK最近的一次,可惜)

首先就想吐槽下它那个破代码平台,真的烂想进去考试显示器缩放必须调成100%,不是哥我显示器缩放招你惹你了,因为用的是3k笔电屏,平时都是250%,调100之后整个系统ui小的跟蚂蚁似的眼睛都酸了

然后代码编辑器,真就是一张白纸,连main函数和导包都得自己写(好在右上角有个指南里面有个Demo,不然要是忘了Scanner要导那个包怕不是直接坐牢俩小时)。总之就是一坨,真的不如牛客

题目方面,算法就两个,没有签到题,第一题就上强度,第二题反而简单一些,因为它是利特扣德上题目《滑动窗口最大值》的变体,做过原型的话基本上就不难想

第一题是给个数组,可以进行一次操作:选定一个区间使得区间内的值都+1。要求尽可能使此操作减少最多数量的逆序对,并返回所减少逆序对的数目

乍一看一点思路都没有,因为光是求取一个数组的逆序对数量就已经是一个hard(参见LCR.170)难度了,这还不包括后面处理最大化收益的逻辑。所以这题坑就坑在它完全不给你暴力的机会。

但注意到题目要求返回的是操作所减少的逆序对的数目(比如原数组5个逆序对操作后变成3个则返回2),所以实际上并不需要求操作前后的逆序对数量分别是多少,只需考虑如何将“受影响的逆序对数量”最大化即可。依照题目,假如我们对区间[L, R]进行操作,则可以把数组分为三部分:[0, L - 1],[L, R],[R + 1, len(arr)]

而中间[L, R]这一段集体+1的操作,对其中每个的x∈[L, R],都会带来 a = count(y, y∈[0, L - 1] & y = x + 1) 个逆序对的减少,但与此同时也会额外增加 b = count(z, z∈[R + 1, len(arr)] & z = x) 个逆序对。而我们要做的是确定这样的一个区间,使 a - b 最大化

显然这样做非常困难,但这个问题是否可以简化一下呢?当然。实际上我们从一开始就掉入了这个题干中的陷阱。事实上并不用选择一个[L, R]区间来进行操作——我们完全可以在任何情况下都贪心地把L之后的元素全部选择:因为它们集体进行了+1,那么这个过程其内部就不会产生额外的逆序对。这样一来问题就简化为了,选定一个下标i,使得 count(i之前的元素 = i及其之后的元素 + 1) 最大化。

实现方面,朴素解法是对于每个下标i都去遍历一遍整个数组,全量计算满足条件的元素对个数,开销是n^2。这里可以使用两个HashMap去算增量,从而将时间开销优化至o(n)通过全部用例,关键部分代码如下:

public int f(int[] arr) {
  Map<Integer, Integer> leftNums = new HashMap<>();
  Map<Integer, Integer> rightNums = new HashMap<>();
  for (int i = 0; i < arr.length; i++) {
	int num = arr[i];
	rightNums.put(num, rightNums.getOrDefault(num, 0) + 1); // 一开始全部都在右侧集合
  }
  int ans = 0;
  int sum = 0;
  for (int i = 0; i < arr.length; i++) {
	int num = arr[i];
	rightNums.put(num, rightNums.get(num) - 1); // 元素离开右侧集合
	sum -= leftNums.getOrDefault(num + 1, 0); // 元素原先作为右侧集合元素被计算的逆序对数量被扣除
	leftNums.put(num, leftNums.getOrDefault(num, 0) + 1); // 元素进入左侧集合
	sum += rightNums.getOrDefault(num - 1, 0); // 计算右侧集合中比该元素小1的元素的个数
	ans = Math.max(ans, sum);
  }
  return ans;
}

第二题是给定一个数组和一个窗口长度,窗口的分值计算规则是:窗口内所有元素去掉一个最高分和一个最低分,其余元素的均值。返回分数最高的窗口的起始下标

这个就不想多做解释了,本质上就是滑动窗口最大值的变体,只是这次需要同时维护最大值和最小值,可以通过两个单调队列来实现。此外还需要增量式地维护每个窗口的总分,然后从两个队列中peek出最高分和最低分减去,再和历史最大值比较即可。注意窗口总分需要使用长整型避免溢出。代码比较冗长这里就不贴了,具体可以去利特寇德上看原型题

(不过不知道为啥我这里无论怎么提交都只过91%的用例,一直到交卷也没找出哪个边界case有问题,可能确实是有些细节没考虑到吧差一点就AK了)

#秋招笔面试记录##牛客创作赏金赛#
全部评论
第一题求出每个点对答案的贡献之后跑个最长连续子序列的和就行了吧,直接这样取max也行吗
点赞 回复 分享
发布于 今天 01:30 北京
你老是告诉我你就本科期间到底有没有打a
点赞 回复 分享
发布于 今天 00:40 湖南
真牛逼啊
点赞 回复 分享
发布于 今天 00:23 上海
猪神强
点赞 回复 分享
发布于 昨天 23:30 浙江
题目强度离谱
点赞 回复 分享
发布于 昨天 23:26 北京
这代码缩进在编辑界面是正常的,怎么一到浏览界面就乱了
点赞 回复 分享
发布于 昨天 22:39 北京

相关推荐

08-15 18:01
已编辑
美团_后端(实习员工)
bg学院本末9硕,6月18日在小红书上看到白袜哥宣传后私信,加入学习,当时项目有做黑马点评和外卖,算法刷了hot100,看了一些小林coding的八股,只是面试全挂了。但基础还行,只缺项目和补一下八股,所以学到7月初开始投,7月9日第一次面试美团,到8月1日前还面过快手、京东、字节、滴滴,但全都挂在了一面,答的很好也挂了。小红书本来hr都要约面了,又说有人已经接offer了所以流程中止,丢失面试机会。挫败感还是比较大的,都有点怀疑人生了,白袜哥跟我说是现在hc少,让再沉淀沉淀,但还是觉得很抑郁,明明都准备好了就是没过一面,找白袜哥聊,跟我讲了很多,现在印象比较深的就是他说暑期有合工大硕0实习一面放水,二面被拷打的完全答不出还是过,三面直接聊天躺赢进字节的故事,但还是觉得意难平,主要是在身边发生,一下有点接受不了。二战转折点在下午,面美团感觉相当好,问的所有问题都答出来了,但又有点担心跟之前一样面的好也挂,但这次并没有,面完半小时hr就打来了电话,问我什么可以到岗,有没有其他流程,如果给了offer会不会去,转折来的太突然让我反复怀疑真的面过了吗,即使白袜哥说这就是oc我还是持保留态度,只是把加了hr微信后的聊天记录发他确保沟通不踩雷,然后每隔一段时间刷新下状态翘首以盼。8月3日还出现了插曲,官网显示面试不通过,差点又道心破碎了,问白袜哥是什么情况,他的答复是美团校招官网经常出奇奇怪怪的bug,比如他暑期教的一个双9面美团时拿到的是那个人三年前本科投美团暑期的简历,但我还是怕变成一场空,就按他的意思去问hr,得到的回应是并没有挂,8月1日就已经推进了流程,只是要过周末,于是在忐忑不安中度过了周末。周一上午美团offer终于来了,悬着的心也是彻底放下。整个过程不是很长,但确实很提心吊胆,最后的offer也是一波三折,开始以为又会跟之前一样寄掉,知道要拿offer了开始高兴,看到官网面试未通过的崩溃,最后终于收到offer的释怀还是感谢下白袜哥在回答疑问之余还耐心的听我发牢骚,咏袜@黑皮白袜臭脚体育生8.15更新&nbsp;补聊天记录
学一下吧现在太菜了:刚面完美团,2道dp一道图论,都有原题,八股也是问一些简单的。面完一面就过了,完事之后美团领导就给发了offer,还给了一个头盔一套制服,不过领导说了,这年头电动车要自己买。
点赞 评论 收藏
分享
评论
5
2
分享

创作者周榜

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