【华为OD机试真题 JS语言】99、特异性双端队列、最小调整顺序次数 | 机试真题+思路参考+代码解析

这篇博客主要介绍了华为OD机试中的一道真题,涉及特异性双端队列的操作。题目要求在执行一系列添加和移除操作后,确保数据移出顺序为1到n,且求最小调整次数。博主提供了详细的解题思路,包括创建一个数组模拟队列,根据指令动态调整数组顺序,以及完整的JS代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


🍂个人博客首页: KJ.JK
 
🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用JS语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习


一、题目


🎃题目描述

有一个特异性的双端队列,该队列可以从头部或尾部添加数据,但是只能从头部移出数据。
 
小A依次执行2n个指令往队列中添加数据和移出数据。其中n个指令是添加数据(可能从头部添加、也可能从尾部添加) ,依次添加1到n; n个指令是移出数据。
 
现在要求移除数据的顺序为1到n。
 
为了满足最后输出的要求,小A可以在任何时候调整队列中数据的顺序。
 
请问小A最少需要调整几次才能够满足移除数据的顺序正好是1到n;


🎃输入输出

输入
第一行一个数据n,表示示数据的范围。
接下来的2n行,其中有n行为添加数据,指令为:
●head add x:表示从头部添加数据

### 华为OD中特殊双向队列的实现与应用 #### 双向队列简介 双向队列(Deque,Double-ended Queue)是一种允许在两端进行插入和删除操作的数据结构。它既可以作为栈也可以作为队列使用,在某些特定场景下非常有用。华为OD中可能会考察基于双向队列的应用问题,尤其是在处理路径规划、广度优先搜索(BFS)、滑动窗口等问题时。 --- #### 特殊双向队列的实现方法 Python 中可以利用 `collections.deque` 来高效实现双向队列的功能[^1]。以下是其基本特性: - 支持从头部和尾部快速插入/删除元素。 - 时间复杂度为 O(1),适合频繁操作两端的情况。 下面是一个简单的双向队列实现示例: ```python from collections import deque # 创建一个双向队列 dq = deque() # 添加元素到右侧 dq.append(1) dq.append(2) # 添加元素到左侧 dq.appendleft(0) print(dq) # 输出: deque([0, 1, 2]) # 删除右侧元素 right_element = dq.pop() print(right_element) # 输出: 2 # 删除左侧元素 left_element = dq.popleft() print(left_element) # 输出: 0 print(dq) # 输出: deque([1]) ``` --- #### 应用实例:滑动窗口最大值问题 这是一个经典的双向队列应用场景,通常会出现在华为OD中。目标是在大小固定的滑动窗口内找到每一步的最大值。 ##### 题目描述 给定一个数组 `nums` 和一个整数 `k`,求长度为 `k` 的滑动窗口每次移动后的最大值。 ##### 解决方案 可以通过维护一个单调递减的双向队列来解决此问题。具体逻辑如下: 1. 维护一个存储索引的双向队列,确保队首始终是当前窗口内的最大值索引。 2. 当新元素进入窗口时,移除队列中小于等于该元素的所有索引。 3. 移除超出窗口范围的索引。 代码实现如下: ```python def max_sliding_window(nums, k): from collections import deque if not nums or k <= 0: return [] result = [] window = deque() # 存储索引 for i in range(len(nums)): # 移除不在窗口范围内的索引 if window and window[0] < i - k + 1: window.popleft() # 移除小于当前元素的索引 while window and nums[window[-1]] <= nums[i]: window.pop() # 将当前索引入队 window.append(i) # 当窗口形成后记录最大值 if i >= k - 1: result.append(nums[window[0]]) return result # 测用例 nums = [1, 3, -1, -3, 5, 3, 6, 7] k = 3 print(max_sliding_window(nums, k)) # 输出: [3, 3, 5, 5, 6, 7] ``` --- #### 广度优先搜索(BFS)中的应用 在 BFS 算法中,双向队列用于按层遍历图或树结构。例如,在计算广播响应时间的问题中,可以借助双向队列优化性能[^4]。 以下是对广播响应时间问题的一个改进版本,其中使用了双向队列代替普通列表: ```python from collections import deque def broadcast_response_time(n, links, start): # 构建邻接表 graph = {i: [] for i in range(1, n + 1)} for u, v in links: graph[u].append(v) graph[v].append(u) # 初始化距离数组 distances = [-1] * (n + 1) distances[start] = 0 # 使用双向队列进行 BFS queue = deque([start]) while queue: current = queue.popleft() for neighbor in graph[current]: if distances[neighbor] == -1: distances[neighbor] = distances[current] + 1 queue.append(neighbor) # 计算最远距离并返回两倍值 max_distance = max(distances[1:]) return max_distance * 2 # 输入样例 n, t = map(int, input().split()) links = [tuple(map(int, input().split())) for _ in range(t)] start = int(input()) response_time = broadcast_response_time(n, links, start) print(response_time) ``` --- #### 性能对比分析 相比于普通的列表实现,`deque` 提供了更高效的两端操作能力。在大规模数据集上,这种差异尤为明显。因此,在华为OD中遇到需要频繁操作两端的场景时,推荐优先考虑 `deque` 数据结构[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KJ.JK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值