【每日一题记录】1441. 用栈操作构建数组

33 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

大家好 我是丝瓜咸蛋汤。今天带来的是一道在LeetCode上的题目,题目难度为中等。就在此为大家分享一下解答思路。

题目阐述

给你一个数组 target 和一个整数 n。每次迭代,需要从  list = { 1 , 2 , 3 ..., n } 中依次读取一个数字。

请使用下述操作来构建目标数组 target :

"Push":从 list 中读取一个新元素, 并将其推入数组中。 "Pop":删除数组中的最后一个元素。 如果目标数组构建完成,就停止读取更多元素。 题目数据保证目标数组严格递增,并且只包含 1 到 n 之间的数字。

请返回构建目标数组所用的操作序列。如果存在多个可行方案,返回任一即可。

来源

思路阐述

这是一道很简单的模拟题。
比较难的地方可能是怎么取进行栈的模拟?
根据题目描述可以知道,list集合是严格递增的,即: list = { 1 , 2 , 3 ..., n },而且target数组也是严格递增的,因为我们最终的结果是要获取拼装成target的“动作”(“Push” / “Pop”)集合,所以,我们只需要遍历target数组,使其与递增的num进行对比,因为num的初始值为1,每次对比num都执行加1操作,所以在最终遍历之后,它的值就是1,2,3……递增的,可以代表题目中所描述的集合list。

创建用于最终结果返回的集合List result;那么,当target[i]等于num的时候,则向result中插入“Push”字符串;当target[i]不等于num的时候,则向result中插入“Push”和“Pop”字符串; 简单点来说就是:
一次遍历,如果cur不在target里面,那就是push pop一起输出,如果在target里面,那就直接push不需要执行下一步pop的操作。

值得一提的是,leetcode上面没有封装好的stack,需要自己用数组去模拟。

代码实现

function buildArray(target: number[], n: number): string[] {
    let cur = 1
    let res = []
    let ti = 0
    while (cur <= n && ti < target.length) {
        res.push('Push')
        if (cur == target[ti])
            ti++
        else
            res.push('Pop')
        cur++
    }
    return res
};

运行结果

执行用时:68 ms, 在所有 TypeScript 提交中击败了51.52%的用户

内存消耗:42.4 MB, 在所有 TypeScript 提交中击败了81.82%的用户

通过测试用例:49 / 49

我是丝瓜咸蛋汤
一名热爱阿森纳的前端工程师
如果本文对您有帮助,可以给一个免费的赞吗?谢谢!

名片.jpg