85.探险
题目描述
小
X
在一片大陆上探险,有一天他发现了一个洞穴,洞穴里面有 n 道门,打开每道门都需要对应的钥匙,编号为 i 的钥匙能用于打开第 i 道门,而且只有在打开了第i (i≥1)
道门之后,才能打开第i+1
道门,一开始只能打开第 1 道门。幸运的是,小 X 在外面探索的途中,每天都能发现一把能打开这 n 道门中其中一道门的钥匙,每天找完钥匙后他都会去打开所有能打开的门。现在给出他每天找到的钥匙编号,请问每道门分别在哪一天被打开。
示例
输入:
第一行包含一个正整数 n ,表示门的数量。
接下来一行包含 n 个正整数 a1,a2,...,an
,其中 ai 表示第 i 天他找到的钥匙的编号,能够打开第 ai 道门,数据保证 a1-an
为 1-n 的一个排列。
输出:
输出一行 n 个数 s1,s2,...,sn
,其中 si 表示第 i 道门在第 si 天被打开。
参考答案
function solve() {
const n = parseInt(prompt());
const a = prompt().split(" ").map(Number);
const pos = new Array(n + 2).fill(0); // 门编号从1开始,pos[1]对应门1的钥匙找到日期
const s = new Array(n + 2).fill(0); // 记录每道门的打开日期
let currentMax = 0;
for (let day = 1; day <= n; day++) {
const key = a[day - 1]; // a数组的索引从0开始,对应第1天到第n天
pos[key] = day; // 记录钥匙对应的找到日期
// 尝试连续开门:从 currentMax+1 开始检查是否能打开
while (currentMax + 1 <= n && pos[currentMax + 1] !== 0) {
const door = currentMax + 1;
s[door] = day; // 记录该门的打开日期为当前天数
currentMax++;
}
}
// 输出门1到门n的打开日期
console.log(s.slice(1, n + 1).join(" "));
}
// 测试输入示例(假设输入为n=3,a=[2 1 3):
solve() 输出应为 "2 1 3"