✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)
文章目录
- 1. 题目描述
- 2. 输入描述
- 3. 输出描述
- 4. Java算法源码
- 5. 测试
- 6.解题思路
1. 题目描述
A公司准备对他下面的N个产品评选最差奖,评选的方式是首先对每个产品进行评分,然后根据评分区间计算相邻几个产品中最差的产品。评选的标准是依次找到从当前产品开始前M个产品中最差的产品,请给出最差产品的评分序列。
2. 输入描述
第一行,数字M,表示评分区间的长度,取值范围是0<M<10000。
第二行,产品的评分序列,比如[12,3,8,6,5],产品数量N范围是-10000<N<10000。
3. 输出描述
评分区间内最差产品的评分序列。
4. Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 评分区间的长度
int M = Integer.valueOf(sc.nextLine());
// 产品的评分序列
int[] scoreArr = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
Deque<Integer> deque = new ArrayDeque<>();
for (int i = 0; i < M; ++i) {
while (!deque.isEmpty() && scoreArr[i] <= scoreArr[deque.getLast()]) {
deque.pollLast();
}
deque.offer(i);
}
List<Integer> list = new ArrayList<>();
for (int i = M; i < scoreArr.length; ++i) {
list.add(scoreArr[deque.getFirst()]);
while (!deque.isEmpty() && scoreArr[i] <= scoreArr[deque.getLast()]) {
deque.pollLast();
}
deque.offer(i);
while (deque.getLast() - deque.getFirst() + 1 > M) {
deque.pollFirst();
}
}
list.add(scoreArr[deque.getFirst()]);
for (int i = 0; i < list.size() - 1; ++i) {
System.out.print(list.get(i) + ",");
}
System.out.print(list.get(list.size() - 1));
}
5. 测试
6.解题思路
- 读取输入的评分区间长度
M
和产品评分序列scoreArr
。 - 创建一个双端队列
deque
,用于存储最差产品的索引。 - 遍历评分序列的前
M
个产品,将索引添加到队列中。在添加索引之前,先将队列尾部不符合最差产品要求的索引移除。 - 创建一个列表
list
,用于存储评分区间内最差产品的评分序列。 - 从第
M
个产品开始遍历评分序列,每次遍历都将队列头部的索引对应的评分添加到list
中。 - 在添加新的索引之前,先将队列尾部不符合最差产品要求的索引移除。
- 检查队列的头部索引是否超出评分区间范围,如果超出,则移除头部索引。
- 将当前索引添加到队列中。
- 继续遍历下一个产品,直到遍历完整个评分序列。
- 最后,输出评分序列
list
。