85.探险

书诚小驿2025/03/14前端面经算法Javascript

题目描述

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"
最后更新时间' 2025/3/25 07:37:15