持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情
刷题的日常-2022年10月15号
一天一题,保持脑子清爽
用栈操作构建数组
来自leetcode的 1441 题,题意如下:
给你一个数组 target 和一个整数 n。每次迭代,需要从 list = { 1 , 2 , 3 ..., n } 中依次读取一个数字。
请使用下述操作来构建目标数组 target :
"Push":从 list 中读取一个新元素, 并将其推入数组中。
"Pop":删除数组中的最后一个元素。
如果目标数组构建完成,就停止读取更多元素。
题目数据保证目标数组严格递增,并且只包含 1 到 n 之间的数字。请返回构建目标数组所用的操作序列。如果存在多个可行方案,返回任一即可。
理解题意
通过题意,我们可以将信息整理如下:
- 题目给定一个数组和一个数n
- 要求我们返回模拟栈的操作,使得栈最终的结果和数组的结果一致
做题思路
其实就是模拟栈的操作,需要注意的是,这里的n没有作用,我们可以不用理它。模拟也很简单,如果数组中出现,那么就意味着出现了一次Push操作,如果没有出现,意味着出现了Push和Pop操作,根据规则可以得出步骤如下:
- 开辟一个List用来返回结果
- 循环数组里面的值
- 如果当前值和前一个值差异大于2,说明中间出现Pop操作,需要将Push和Pop加进结果
- 然后将当前值加进结果
- 返回结果
代码实现
代码实现如下:
public class Solution {
public List<String> buildArray(int[] target, int n) {
List<String> result = new ArrayList<>(target.length * 2);
n = 0;
int diff;
for (int num : target) {
diff = num - n;
while (diff-- > 1) {
result.add("Push");
result.add("Pop");
}
result.add("Push");
n = num;
}
return result;
}
}