有 n 个人正在排队,每个人除了队首都只知道排在自己之前的人是谁,请你尝试还原出这个队列c++


下面是一个用 C++ 实现根据每个人所知道的排在自己之前的人来还原队列的代码: ```cpp #include <iostream> #include <vector> #include <unordered_map> // 函数用于还原队列 std::vector<int> restoreQueue(const std::vector<int>& pre) { int n = pre.size(); // 用于记录每个人的后继,即当前人后面是谁 std::unordered_map<int, int> next; int first = -1; // 遍历 pre 数组,构建 next 映射,并找出队首 for (int i = 0; i < n; ++i) { if (pre[i] == -1) { // 队首的 pre 值为 -1 first = i; } else { // 记录 pre[i] 的后继是 i next[pre[i]] = i; } } std::vector<int> queue; int current = first; // 从队首开始,按照后继关系依次加入队列 while (current != -1) { queue.push_back(current); // 找到当前人的后继 current = next.count(current) ? next[current] : -1; } return queue; } int main() { // 示例输入,pre[i] 表示排在第 i 个人之前的人的编号 std::vector<int> pre = {-1, 0, 1, 2}; std::vector<int> queue = restoreQueue(pre); // 输出还原后的队列 for (int person : queue) { std::cout << person << " "; } std::cout << std::endl; return 0; } ``` 代码解释 1. `restoreQueue` 函数: - 首先,创建一个 `unordered_map` 类型的 `next` 用于记录每个人的后继。 - 遍历 `pre` 数组,找到队首(`pre` 值为 -1 的人),并构建 `next` 映射。 - 从队首开始,按照后继关系依次将人加入队列,直到没有后继为止。 2. `main` 函数: - 提供一个示例输入 `pre` 数组。 - 调用 `restoreQueue` 函数还原队列。 - 输出还原后的队列。 额外需要注意的逻辑点 1. 输入的 `pre` 数组必须保证有且只有一个 -1,表示队首。 2. `pre` 数组中的编号必须在 0 到 `n - 1` 之间,其中 `n` 是人数。 3. 确保输入的 `pre` 数组能够形成一个有效的队列,即不会出现循环或断开的情况。 [2025-07-27 11:12:38 | AI写代码神器 | 644点数解答]
- 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过: 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。 返回 k(149点数解答 | 2024-10-08 23:07:36)158
- 判断素数 类别:python 程序控制结构 用户输入一个正整数 n,判断该数字是否为素数,素数即为质数,一个大于 1 的自然数,除了 1 和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。在一般领域,对正整数 n,如果用 2 到 n-1 之间的所有整数去除,均无法整除,则 n 为素数。(该算法可优化) 要求:(171点数解答 | 2024-10-18 15:40:19)281
- [BJ2007.X3] 排队/婷婷的身高 题目描述 婷婷是一个喜欢舞蹈的女孩儿,还报了一个专门学习舞蹈的班呢。 在入学的时候,老师让大家根据自己的身高排了一下队,个子小的同学排前面,个子一样高的同学,先后顺序随意。 如果给你这些同学的身高数据,你能计算一下婷婷最前可以排第几、最后可以排第几么? 输入格式 第一行是一个整数 n n ( 1 ≤ n ≤ 3 0 ) 1≤n≤30),表示舞蹈班所有同学的人数。 第二行是n个整数,表示所有同学的身高(不超过 3 0 0 300 厘米),以厘米为单位。这n个同学的数据,包括婷婷本人的。 第三行是一个整数,表示婷婷的身高。 输出格式 只有两个整数,用空格分开,分别表示:从前面数,婷婷可能排的最前的位置和最后的位置。 样例 #1 样例输入 #1 8 133 134 132 133 131 130 138 133 133 样例输出 #1 4 6 提示 请输入答案 C++ (281点数解答 | 2025-01-14 10:49:34)181
- [BJ2007.X3] 排队/婷婷的身高 题目描述 婷婷是一个喜欢舞蹈的女孩儿,还报了一个专门学习舞蹈的班呢。 在入学的时候,老师让大家根据自己的身高排了一下队,个子小的同学排前面,个子一样高的同学,先后顺序随意。 如果给你这些同学的身高数据,你能计算一下婷婷最前可以排第几、最后可以排第几么? 输入格式 第一行是一个整数 n n ( 1 ≤ n ≤ 3 0 ) 1≤n≤30),表示舞蹈班所有同学的人数。 第二行是n个整数,表示所有同学的身高(不超过 3 0 0 300 厘米),以厘米为单位。这n个同学的数据,包括婷婷本人的。 第三行是一个整数,表示婷婷的身高。 输出格式 只有两个整数,用空格分开,分别表示:从前面数,婷婷可能排的最前的位置和最后的位置。 样例 #1 样例输入 #1 8 133 134 132 133 131 130 138 133 133 样例输出 #1 4 6 提示 请输入答案 C++ (263点数解答 | 2025-01-14 10:49:37)155
- 作为c#工程师,数组、链表、哈希、队列、栈数据结构特点,各⾃优点和缺点?(561点数解答 | 2023-11-09 17:56:30)178
- 没看到有etc/kong/kong-manager.conf 这个(232点数解答 | 2024-05-19 16:01:08)216
- 在十进制整数转换为其他进制的算法中,用 存储结构最合适。 a、树形 b、队列 c、栈 d、图形(57点数解答 | 2024-11-13 01:21:11)149
- [问题描述]windows 资源管理器(file explorer)是 windows 操作系统中用于管理文件和文件夹的文件管理器,为用户在 windows 操作系统中进行文件和文件夹管理提供了便利和多样的功能。请模拟该软件完成一个自己的文件管理器,具体要求如下:(1) 文件和文件夹操作(60 分):可以创建、复制、粘贴、移动、重命名和删除文件和文件夹。(2) 导航和路径(10 分):允许用户在文件系统中导航,查看文件路径和目录结构,以快速定位文件或文件夹。(3) 搜索(10 分):提供搜索功能,可以按文件名、文件类型、修改日期等进行搜索并定位文件。(4) 文件属性(10 分):允许查看文件的属性,如大小、创建日期、修改日期和文件类型等。(5) 快速访问(10 分):提供快速访问常用文件夹和最近访问的文件功能,方便用户快速打开常用文件或文件夹。(6) 标签页(附加 10 分):允许用户以标签页形式打开多个文件资源管理器窗口,方便在4不同位置之间进行拖放操作或文件整理。[测试数据]参考操作系统中资源管理器。[实现提示]可能用到树、链表、哈希表、栈、队列、图等。,语言方向:Java,系统环(623点数解答 | 2025-01-01 14:59:04)156
- 假设在周末舞会上,男士和女士们分别进入舞厅,各自排成一队。跳舞开始,依次从男队和女队队头各出一人配成舞伴,若两队初始人数不同,则较长那一队未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。 你需要用队列操作实现上述算法。请完成下面5个函数的操作。 函数接口定义: int QueueLen(SqQueue Q);//队列长度 int EnQueue(SqQueue &Q, Person e);//加入队列 int QueueEmpty(SqQueue &Q);//队列是否为空 int DeQueue(SqQueue &Q, Person &e);//出队列 void DancePartner(Person dancer[], int num); //配对舞伴 Q:队列 e:参加舞会的人 dancer:全部舞者 num:参加舞会的人数 ###输入说明 先输入参加舞会人数,再分别输入参加舞会人的姓名和性别 ###输出说明 先输出配对的男女舞伴,若队伍有剩人,则输出剩下人性别及剩下人数目。 裁判测试程序样例: #include<io(601点数解答 | 2025-05-18 11:27:45)114
- 题目描述 话说孙悟空取经的途中曾遇到一座大山,大山上有很多宝藏,当然了,妖怪也是在所难免的,此山能大能小,最高不过50米,最宽嘛也不过40米而已,此山是通往西天取经的必经之路,山上有很多的宝藏,宝藏都位于洞穴之中,你路过洞穴,就能获得宝藏,当然了,你遇到妖怪之后还要上交过路费,当宝藏大于等于0的时候,你就能获得它,当少于0的时候,说明洞穴中存在妖怪,你要上交过路费了,宝藏最大不超过100块,不小于-100块;小猴子是打不过他们的,因为他没有了72变,你要想问为什么,这个、、、 PS:此时的你位于左山脚下,你的任务就是到达山顶最右端,并取得最大的价值,以供在以后的路上开销,此山特别的神奇,当你每上升一层的时候,你的下面就全部自动消失了,当你每向右走一层的时候,你的左面也全部自动消失了; 输入 输入: 开始先输入一个T,表示下面有T组数据; 接下来会有T组测试用例,每组数组第一行有两个数x,y,分别表示山的高和山的宽; 接下来有x行,每行有y个数;第一行表示最上面一层,第二行最上面的下面一层、、、最后一行表示最底层; 输出 输出T组数据,每组数据表示猴子所能获得的最大的金钱数; 样例输(862点数解答 | 2025-06-14 21:01:48)113
- java截取字符串最后一个/到最后一个.之前(354点数解答 | 2024-05-22 14:04:00)176
- 请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。 输入格式: 输入给出正整数n(<10)。 输出格式: 输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列a 1 ,a 2 ,⋯,a n 排在序列b 1 ,b 2 ,⋯,b n 之前,如果存在k使得a 1 =b 1 ,⋯,a k =b k 并且 a k+1 <b k+1 。 用c语言(275点数解答 | 2024-11-18 21:37:28)210