京东8.24笔试第三批-后端开发(AK)
1.基础选择题10题
2.java八股选择题5题(可以选c++/go)
3.编程题3题
(1)给定一个10^100的数 n,问0~n有多少个能被100整除的数
做法:string读入后两位不输出
(2)有一个n * m矩阵,初始全为白色,t次操作,每次操作为修改其中一个颜色为黑色,或者询问某个坐标的上下左右第一个为白色的坐标。
做法: 数据范围 1<= n, m <= 100, 1 <= t <= 1e5, 直接模拟就好了。
(3) 给定 n 个数字,找到一个长度最大的区间,使得区间内所有数任取三个都能组成三角形
数据范围:1 <= n <= 1e6
做法: 首先不难想到对于判断一个区间是否满足条件,只需要看该区间的【最大值,次大值,最小值】以及【最大值,次小值,最小值】是否能组成三角形,这两个条件满足则 整个区间满足。
剩下的就是双指针跑一遍就行了,难点在于维护【最大值,次大值,次小值, 最小值】,这里用的是multiset,调了好久才960ms卡过去,差点就上手动快读了
代码:
#include <iostream> #include <set> using namespace std; const int N = 1e6 + 10; int n, a[N], ans, l, r; int zd, cd, zx, cx; multiset<int> se; signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n; for(int i = 1; i <= n; i ++) { cin >> a[i]; } int nl = 1, nr = 1; while(nr < n) { se.insert(a[nr]); if(se.size() > 2) { zd = *se.rbegin(); cd = *(++ se.rbegin()); zx = *se.begin(); cx = *(++ se.begin()); if(zx + cx > zd && zd - cd < zx) { if(nr - nl + 1 > ans) { ans = nr - nl + 1; l = nl; r = nr; } } else { auto it = se.find(a[nl]); se.erase(it); nl ++; } } nr ++; } if(ans > 2) cout << l << ' ' << r << '\n'; else cout << "1 2\n" << endl; }#京东求职进展汇总##京东##笔试##京东笔试##我的实习求职记录#