持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目提示
1 <= target.length <= 1001 <= n <= 1001 <= target[i] <= ntarget严格递增
二、思路分析:
我们今天拿到本题是 leetcode 难度为中等题 1441. 用栈操作构建数组。题目要求模拟栈来构建数组过程,并返回栈操作过程记录。题目中给出几个细节点:
- target数组中的元素是递增关系
- 迭代顺序是从1~n的列表中依次读取数字
- 栈的操作:入栈(Push)和出栈(Pop)
- 当构建target完成时,就会终止读取数字
根据题目内容介绍,我们可以使用双指针模拟来解答本题,思路如下:
-
方法一:双指针模拟
- 定义两个指针变量i和j,i指向list列表,j指向target数组起始位置
- 循环遍历target数组,当i+1与target[i]元素不相等时,则需要将i+1数字先进行入栈操作,再进行出栈操作,且i指针向右移动一次
- 当 i+1与target[i]元素相等时,则将i+1数字进行入栈操作,i和j指针同时向右移动一次
- 直到遍历完target数组位置,返回oplist数组即可
class Solution(object): def buildArray(self, target, n): """ :type target: List[int] :type n: int :rtype: List[str] """ oplist = [] m = len(target) i,j = 0,0 while i < n and j < m: if i+1 != target[j]: oplist.append("Push") oplist.append("Pop") else: oplist.append("Push") j +=1 i +=1 return oplist -
方法二:写法二
- python中列表可以拼接,我们可以直接使用一行代码
class Solution(object): def buildArray(self, target, n): """ :type target: List[int] :type n: int :rtype: List[str] """ return [i for item in [['Push'] if i in target else ['Push', 'Pop'] for i in range(1, max(target) + 1)] for i in item]
三、总结:
本题是一道关于栈操作的应用,依次读取list中数字构建target数组,对于target不存在的数字需要先入栈再出栈操作,AC提交记录如下:
- 时间复杂度:O(n),push操作n次
- 空间复杂度:O(1),除返回值没有使用额外空间
以上是本期内容,欢迎大佬们点赞评论,下期见~~~