2024-03-09:用 go 语言,我们把无限数量的栈排成一行,按从左到右的次序从 0 开始编号, 每个栈的的最大容量 capacity 都相同。实现一个叫「餐盘」的类 DinnerPlates, Di
2024-03-09:用 go 语言,我们把无限数量的栈排成一行,按从左到右的次序从 0 开始编号,
每个栈的的最大容量 capacity 都相同。实现一个叫「餐盘」的类 DinnerPlates,
DinnerPlates(int capacity) - 给出栈的最大容量 capacity,
void push(int val) 将给出的正整数 val 推入 从左往右第一个 没有满的栈,
int pop() 返回 从右往左第一个 非空栈顶部的值,并将其从栈中删除,
如果所有的栈都是空的,请返回 -1。
int popAtStack(int index) - 返回编号 index 的栈顶部的值,并将其从栈中删除,
如果编号 index 的栈是空的,请返回 -1。
输入:["DinnerPlates","push","push","push","push","push","popAtStack","push","push","popAtStack","popAtStack","pop","pop","pop","pop","pop"][[2],[1],[2],[3],[4],[5],[0],[20],[21],[0],[2],[],[],[],[],[]]。
输出:[null,null,null,null,null,null,2,null,null,20,21,5,4,3,1,-1]。
答案 2024-03-09:
来自左程云。
大体步骤如下:
这个问题需要实现一个类 DinnerPlates
,其中含有 Constructor
、Push
、Pop
和 PopAtStack
四个方法。这个类可以理解成是具有固定容量的多个栈构成的一种数据结构。根据题目描述和提供的 Go 代码文件,这里来分步骤描述大体过程,然后讨论总的时间复杂度和总的空间复杂度。
1.Constructor:
当创建
DinnerPlates
实例时,通过调用Constructor
方法初始化一个 DinnerPlates 类型的实例。需要传入一个参数capacity
表示栈的最大容量。在这个方法中,将capacity
存储到实例字段中,并初始化stack
、top
和poppedPos
三个切片。
2.Push:
当调用
Push
方法时,将给定的整数值val
推入从左到右第一个没有满的栈。如果所有栈都已满,应该创建一个新的栈来存储
val
。如果有栈未满,则将
val
推入最左侧未满的栈中,并更新top
数组和stack
数组。
3.Pop:
当调用
Pop
方法时,应该返回最右侧非空栈顶的值,并将其从栈中删除。如果所有的栈都为空,返回 -1。如果有非空的栈,应该找到最右侧非空栈并返回它的栈顶的值,然后将其值从栈中删除。
4.PopAtStack:
当调用
PopAtStack
方法时,应该返回指定index
栈的栈顶的值,并将其从栈中删除。如果指定index
的栈为空,返回 -1。需要更新
top
数组和poppedPos
数组,以确保栈的一致性。
总的时间复杂度:
Push 方法的时间复杂度为 O(1)。
Pop 方法的时间复杂度为 O(1)。
PopAtStack 方法的时间复杂度为 O(log n),其中 n 是被删除的元素的数量。
总的空间复杂度:
需要 O(n) 的空间来存储栈中的所有元素,其中 n 是所有栈的元素数量。
go 完整代码如下:
版权声明: 本文为 InfoQ 作者【福大大架构师每日一题】的原创文章。
原文链接:【http://xie.infoq.cn/article/70009e354bab1a4c247160428】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论