持续创作,加速成长!这是我参与「掘金日新计划 · 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
我是丝瓜咸蛋汤
一名热爱阿森纳的前端工程师
如果本文对您有帮助,可以给一个免费的赞吗?谢谢!