京东笔试第三题怎么做
我把我的代码贴上来了,不知道怎么做的地方写了TODO,希望有大佬可以指点一下,谢谢!祝大家秋招都顺利!
引流一下:百度 阿里 腾讯 字节跳动 小红书
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = in.nextInt();
}
// 最小的两个数之和大于最大的数
Deque maxNum = new LinkedList<>(); // 存区间最大值
Deque; minNum = new LinkedList<>(); // 存区间最小值
int left = 0; // 初始化左端点
int[] maxrange = new int[2]; // 存最大区间的左右两个端点
maxrange[0] = 0; // 左端点初始为 0
maxrange[1] = 1; // 右端点初始为 1
int maxlen = 2; // 最大区间的长度
for (int right = 0; right < n; right++) {
while (!maxNum.isEmpty() && nums[maxNum.getFirst()] < nums[right]) {
maxNum.removeFirst();
}
maxNum.addLast(right);
while (!minNum.isEmpty() && nums[right] < nums[minNum.getFirst()]) {
minNum.removeFirst();
}
minNum.addLast(right);
if (right - left > 1) { // 如果区间长度大于 2,判断最小值加第二小值是否大于最大值
// 如果最小值加第二小值大于最大值, flag = true;
// 反之,flag = false;
// TODO: 怎么存第二小值从而判断 flag?
boolean flag = true;
if (flag) { // 如果满足三角形要求,判断区间长度是否变长
if (right - left + 1 > maxlen) {
maxlen = right - left + 1;
maxrange[0] = left;
maxrange[1] = right;
}
} else { // TODO: 如果不满足三角形要求,怎么做?
while (right - left > 1) {
left++;
while (!maxNum.isEmpty() && maxNum.getFirst() < left) maxNum.removeFirst();
while (!minNum.isEmpty() && minNum.getFirst() < left) minNum.removeFirst();
}
}
}
}
System.out.println(maxrange[0] + 1 + " " + (maxrange[1] + 1));
}
引流一下:百度 阿里 腾讯 字节跳动 小红书
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = in.nextInt();
}
// 最小的两个数之和大于最大的数
Deque maxNum = new LinkedList<>(); // 存区间最大值
Deque; minNum = new LinkedList<>(); // 存区间最小值
int left = 0; // 初始化左端点
int[] maxrange = new int[2]; // 存最大区间的左右两个端点
maxrange[0] = 0; // 左端点初始为 0
maxrange[1] = 1; // 右端点初始为 1
int maxlen = 2; // 最大区间的长度
for (int right = 0; right < n; right++) {
while (!maxNum.isEmpty() && nums[maxNum.getFirst()] < nums[right]) {
maxNum.removeFirst();
}
maxNum.addLast(right);
while (!minNum.isEmpty() && nums[right] < nums[minNum.getFirst()]) {
minNum.removeFirst();
}
minNum.addLast(right);
if (right - left > 1) { // 如果区间长度大于 2,判断最小值加第二小值是否大于最大值
// 如果最小值加第二小值大于最大值, flag = true;
// 反之,flag = false;
// TODO: 怎么存第二小值从而判断 flag?
boolean flag = true;
if (flag) { // 如果满足三角形要求,判断区间长度是否变长
if (right - left + 1 > maxlen) {
maxlen = right - left + 1;
maxrange[0] = left;
maxrange[1] = right;
}
} else { // TODO: 如果不满足三角形要求,怎么做?
while (right - left > 1) {
left++;
while (!maxNum.isEmpty() && maxNum.getFirst() < left) maxNum.removeFirst();
while (!minNum.isEmpty() && minNum.getFirst() < left) minNum.removeFirst();
}
}
}
}
System.out.println(maxrange[0] + 1 + " " + (maxrange[1] + 1));
}
全部评论
滑动窗口+优先队列做
相关推荐
02-25 16:29
齐鲁工业大学 golang
找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。
你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。
工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。 点赞 评论 收藏
分享
查看10道真题和解析