十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

2024.05.11 360春招WEB前端编程题

2024.05.11 360春招WEB前端编程题 编程题第一题探险小 X 在一片大陆上探险有一天他发现了一个洞穴洞穴里面有 n 道门打开每道门都需要对应的钥匙编号为 i 的钥匙能用于打开第 i 道门而且只有在打开了第 i (i ≥ 1) 道门之后才能打开第 i 1 道门一开始只能打开第 1 道门。幸运的是小 X 在外面探索的途中每天都能发现一把能打开这 n 道门中其中一道门的钥匙每天找完钥匙后他都会去打开所有能打开的门。现在给出他每天找到的钥匙编号请问每道门分别在哪一天被打开。输入第一行包含一个正整数 n 表示门的数量。接下来一行包含 n 个正整数 a1a2...an其中 ai 表示第 i 天他找到的钥匙的编号能够打开第 ai 道门数据保证 a1-an 为 1-n 的一个排列。输出输出一行 n 个数 s1s2...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 道门所以这里判断 dp[i-1] 是否 0第 i - 1 个钥匙是否出现因为一开始只能打开第 1 道门所以 dp[0] -1因为每天获取一把钥匙所以钥匙在数组中的索引 1 第几天在打开第 i 道门之后还要判断第 i 1 个的钥匙是不是出现了这里使用 while 循环一定要注意边界条件 a nums.length否则 dp 数组会一直往后无限循环。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 编程题了我之前没有刷到过而已
返回列表