刷题的日常-用栈操作构建数组

57 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;
    }
}

7577a0a27539b0c8e4e9ed18187b1a4.jpg