2024.05.11 360春招WEB前端编程题

编程题第一题:探险

小 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 天被打开。

示例 1:

输入:

复制代码
5
[5, 3, 1, 2, 4]

输出:

复制代码
[3, 4, 4, 5, 5]

思路与代码实现

我的思路比较简单,就是用一个数组 dp,表示对应索引 index(第 i 个门)的钥匙是否已经出现,如果未出现就是 0,出现了就是 -1;

而判断第 i 道门能否打开,就是看它之前的门(第 i - 1 道门)是否已经打开(题目:只有在打开了第 i (i ≥ 1) 道门之后,才能打开第 i + 1 道门),所以这里判断 dpi-1 是否 == 0(第 i - 1 个钥匙是否出现)

因为一开始只能打开第 1 道门,所以 dp0 = -1;因为每天获取一把钥匙,所以钥匙在数组中的索引 + 1 = 第几天

在打开第 i 道门之后,还要判断第 i + 1 个的钥匙是不是出现了?

这里使用 while 循环,一定要注意边界条件 && a <= nums.length,否则 dp 数组会一直往后无限循环。

javascript 复制代码
var keys = [5, 3, 1, 2, 4]

var calculate = function (nums) {
    let dp = Array.from({ length: nums.length + 1 }, () => 0)
    dp[0] = -1

    for (let i = 0; i < nums.length; i++) {
        if (dp[nums[i] - 1] != 0) {
            dp[nums[i]] = i + 1
            let a = nums[i] + 1
            while (dp[a] != 0 && a <= nums.length) {
                dp[a] = i + 1
                a++
            }
        } else {
            dp[nums[i]] = -1
        }
    }

    return dp.slice(1)
}

console.log(calculate(keys))

(其实这是 22 年的 360 编程题了,我之前没有刷到过而已)

相关推荐
碧海银沙音频科技研究院1 小时前
基于ATS308X的无线语音交互对话功能实现
人工智能·嵌入式硬件·深度学习·算法
尹玉玺2 小时前
从原子残片到天道公理:以德谟克利特思想全貌,重新定界西方唯物认知的历史层级与边界
人工智能·算法·架构
青少儿编程课堂2 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:差分数组与区间修改实战解析
c++·python·算法·bfs·信息学竞赛
重生之小比特2 小时前
【算法拾光】二分查找|二分查找 + 再排序数组中查找元素的第一个和最后一个位置
算法·leetcode·职场和发展
零基础1233 小时前
基于模型的强化学习与不基于模型的强化学习:核心区别与实战选择
python·算法
罗西的思考14 小时前
【Agentic RL】Dressage Staleness 控制深度分析
人工智能·算法·机器学习
quaer14 小时前
弗洛伊德算法--判圈法寻找环的入口O(n) O(1)
数据结构·算法
高晶15 小时前
无乘法器实现LC二阶滤波器:基于移位运算的快速算法与四种精度推导
算法·设计模式·程序员
ysbfsy15 小时前
大数计算思路
算法
高晶16 小时前
主从自动分配算法:平均值乘以设备数一半的选举基准值解析
算法·设计模式·程序员