京东 秋招 0816 大后端笔试(Golang方向)

30个选择题(60分) + 2个编程题(40分)

选的 Golang 的笔试题,主要就是数据结构 + golang 语法 + 其他,总体不难,能吐槽的点就是给的示例代码没有任何缩进

编程题两个大概力扣 Mid 难度的题

编程题:

1. 选定区间[L, R]使得该区间内所有数 + 1,求能够减少的最大逆序对的数量

解法:由于[L, R]区间内 + 1 对逆序对没有影响,且可能导致如果[R+1, n]区间内的逆序对数量增加,因此最优区间的 R 一定等于 n;故只需要考虑[0, L-1]这个区间,逆序对减少的数量。所以只要用两个哈希表记录一下当前下标 i 左边和右边每个数出现的次数,计算如果选择[i, n]这个区间能够减少的最大的逆序对数量 = r[a[i] + 1] - l[a[i] - 1],更新答案即可

2. 求固定长度m区间内去掉一个最大值和最小值外的最大和的区间的编号

解法:维护一个最大堆和最小堆,采用延迟删的思想,并用一个固定长度为 m 的滑动窗口,当一个数滑出窗口时用一个哈希表记录下,每次从堆中取数的时候判断当前取的是否被删除,如果删除了就pop后再取一个直到取到没有被删除的数为止

全部评论
大佬都是100%吗
1 回复 分享
发布于 08-16 21:06 辽宁
我第一道暴力超时了就过了36
点赞 回复 分享
发布于 08-16 21:09 上海

相关推荐

08-18 16:57
已编辑
门头沟学院 Java
蒟蒻一枚呢:团子正式批还没开始面试呢,这咋都考试oc了
点赞 评论 收藏
分享
0816 京东笔试答案第一题, 减少逆序对数量对于每个 ai, 找到 所有 aj = a[i] + 1 且 j < i 的 j, 则对于选择 j < L <= i 的 L 贡献 +1, 然后做一个前缀和取最大值即可代码```#include <iostream>#include <cstring>#include <algorithm>#include <vector>#include <unordered_map>using namespace std;void solve(){int n; cin >> n;vector<int> a(n + 10, 0), b(n + 10, 0), c(n + 10, 0);unordered_map<int, vector<int>> pos;for (int i = 1; i <= n; i ++){cin >> a[i];}for (int i = 1; i <= n; i ++){int v =a[i];int t = v + 1;if (pos.find(t) != pos.end()){for (int j : pos[t]){if (j < i){b[j + 1] ++;b[i + 1] --;}}}pos[v].push_back(i);}int ans = 0;int tmp = 0;for (int i = 1; i <= n; i ++){tmp += b[i];ans = max(ans, tmp);}cout << ans << endl;}int main(){int _ = 1;cin >> _;while (_ --){solve();}}```第二题, 跳水打分解法类似求区间最值, 维护每个长度为 m 的区间的最大值和最小值, 然后遍历过去即可算出答案。代码```#include <bits/stdc++.h>#define PII pair<long, long>#define x first#define y secondusing namespace std;int main(){int n, m;cin >> n >> m;priority_queue<PII> maxPq;priority_queue<PII, vector<PII>, greater<PII>> minPq;vector<long long> a(n + 10);double ans = 0;long long tmp = 0;for (int i = 1; i <= n; i ++) cin >> a[i];for (int i = 1; i <= m; i ++){maxPq.push({a[i], i});minPq.push({a[i], i});tmp += a[i];}long long minV = minPq.top().x;long long maxV = maxPq.top().x;ans = double(tmp - minV - maxV) / (m - 2);int ans2 = 1;int l = 1, r = m;while (r < n){// cout << ans << endl;tmp -= a[l]; l ++;r ++; tmp += a[r];minPq.push({a[l], l}); minPq.push({a[r], r});maxPq.push({a[l], l}); maxPq.push({a[r], r});while (minPq.top().y < l) minPq.pop();while (maxPq.top().y < l) maxPq.pop();if ((double(tmp - minPq.top().x - maxPq.top().x) / (m - 2)) > ans){ans = double(tmp - minPq.top().x - maxPq.top().x) / (m - 2);ans2 = l;}}cout << ans2 << endl;}```
投递京东等公司10个岗位
点赞 评论 收藏
分享
评论
2
4
分享

创作者周榜

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