京东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;
}

#京东求职进展汇总##京东##笔试##京东笔试##我的实习求职记录#
全部评论

相关推荐

4 11 评论
分享
牛客网
牛客企业服务