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完整代码如下:
package main
import (
"fmt"
"sort"
)
type DinnerPlates struct {
capacity int
stack []int
top []int
poppedPos []int
}
func Constructor(capacity int) DinnerPlates {
return DinnerPlates{capacity, []int{}, []int{}, []int{}}
}
func (this *DinnerPlates) Push(val int) {
if len(this.poppedPos) == 0 {
pos := len(this.stack)
this.stack = append(this.stack, val)
if pos%this.capacity == 0 {
this.top = append(this.top, 0)
} else {
stackPos := len(this.top) - 1
stackTop := this.top[stackPos]
this.top[stackPos] = stackTop + 1
}
} else {
pos := this.poppedPos[0]
this.poppedPos = this.poppedPos[1:]
this.stack[pos] = val
index := pos / this.capacity
stackTop := this.top[index]
this.top[index] = stackTop + 1
}
}
func (this *DinnerPlates) Pop() int {
for len(this.stack) > 0 && len(this.poppedPos) > 0 && this.poppedPos[len(this.poppedPos)-1] == len(this.stack)-1 {
this.stack = this.stack[:len(this.stack)-1]
pos := this.poppedPos[len(this.poppedPos)-1]
this.poppedPos = this.poppedPos[:len(this.poppedPos)-1]
if pos%this.capacity == 0 {
this.top = this.top[:len(this.top)-1]
}
}
if len(this.stack) == 0 {
return -1
} else {
pos := len(this.stack) - 1
val := this.stack[pos]
this.stack = this.stack[:pos]
if pos%this.capacity == 0 && len(this.top) > 0 {
this.top = this.top[:len(this.top)-1]
} else if len(this.top) > 0 {
this.top[len(this.top)-1] -= 1
}
return val
}
}
func (this *DinnerPlates) PopAtStack(index int) int {
if index >= len(this.top) {
return -1
}
stackTop := this.top[index]
if stackTop < 0 {
return -1
}
this.top[index] = stackTop - 1
pos := index*this.capacity + stackTop
i := sort.SearchInts(this.poppedPos, pos)
this.poppedPos = append(this.poppedPos, 0)
copy(this.poppedPos[i+1:], this.poppedPos[i:])
this.poppedPos[i] = pos
return this.stack[pos]
}
func main() {
dinnerPlates := Constructor(2)
dinnerPlates.Push(1)
dinnerPlates.Push(2)
dinnerPlates.Push(3)
dinnerPlates.Push(4)
dinnerPlates.Push(5)
fmt.Println(dinnerPlates.PopAtStack(0))
dinnerPlates.Push(20)
dinnerPlates.Push(21)
fmt.Println(dinnerPlates.PopAtStack(0))
fmt.Println(dinnerPlates.PopAtStack(2))
fmt.Println(dinnerPlates.Pop())
fmt.Println(dinnerPlates.Pop())
fmt.Println(dinnerPlates.Pop())
fmt.Println(dinnerPlates.Pop())
fmt.Println(dinnerPlates.Pop())
}

2024-03-09:用go语言,我们把无限数量的栈排成一行,按从左到右的次序从 0 开始编号, 每个栈的的最大容量 capacity 都相同。实现一个叫「餐盘」的类 DinnerPlates, Di的更多相关文章
- 【转】具透 | 你可能不知道,iOS 10 有一个中国「特供」的联网权限功能
9 月底,苹果正式在北京成立了苹果中国研发中心.近几年,我们也在每年更新的 iOS 系统中不断看到,苹果对中国市场的关照.从早前的九宫格输入法,到最近的骚扰电话拦截,都照顾了国内用户的需求. 在 iO ...
- 从「Hello World」说起
标签: node模块 从一个简单「hello world」程序对 node.js 有个感性的认识. const http = requier ('http'); const pathname = '1 ...
- 分片利器 AutoTable:为用户带来「管家式」分片配置体验
在<DistSQL:像数据库一样使用 Apache ShardingSphere>一文中,Committer 孟浩然为大家介绍了 DistSQL 的设计初衷和语法体系,并通过实战操作展示了 ...
- 「Usaco2008 Jan」人工湖O(∩_∩)O 纯属的模拟+栈
题目描述 夏日那让人喘不过气的酷热将奶牛们的烦躁情绪推到了最高点.最终,约翰决定建一个人工湖供奶牛消暑之用. 为了使湖看起来更加真实,约翰决定将湖的横截面建成N(1≤N≤105)个连续的平台高低错落的 ...
- loj #2024. 「JLOI / SHOI2016」侦查守卫
#2024. 「JLOI / SHOI2016」侦查守卫 题目描述 小 R 和 B 神正在玩一款游戏.这款游戏的地图由 nnn 个点和 n−1n - 1n−1 条无向边组成,每条无向边连接两个点, ...
- 从开发属于你自己的第一个 Python 库,做一名真正的程序员「双语版」
你好,我是悦创.之前我在 CSDN 编写了一篇开发 Python 库的教程,有人加我提问到的一些问题,我来更新一下这篇文章:https://blog.csdn.net/qq_33254766/arti ...
- 硬吃一个P0故障,「在线业务」应该如何调优HBase参数?
1.背景 由于种种原因,最近将核心业务生产使用的HBase迁移到了云上的弹性MapReduce(EMR)集群上,并使用了EMR的HBase组件默认参数配置. 结果在流量高峰期出现了宿主机故障,挂掉了两 ...
- LaTeX 有哪些「新手须知」的内容?
孟晨 ,在 LaTeX 话题下写错 LaTeX 名字的,一律… 陈硕等 137 人赞同 这是个好问题,虽然提问提得很大.不是很好答,权当抛砖引玉了. 天字第一号原则:不要到网上抄代码,尤其是似懂非懂的 ...
- MongoDB6.0的安装「2023年」
你好,我是悦创. 优质原文格式:https://bornforthis.cn/column/crawler/supplement/mongodb-install.html 点进去有惊喜. 吐槽,这篇博 ...
- 前端构建工具之gulp(一)「图片压缩」
前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ...
随机推荐
- Django笔记四十二之model使用validator验证器
本文首发于公众号:Hunter后端 原文链接:Django笔记四十二之model使用validator验证器 这一篇笔记介绍一下 model 里的 validator 验证器. 首先,这是个什么东西呢 ...
- 【5】Vscode Todo Tree插件使用和TODO、FIXME和XXX的注释使用说明以及自制自己的TODO图标样式!
相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...
- centOS系统 迁移docker镜像及数据文件到指定目录
话说我今天正在快乐的敲代码,突然看到IDE报警磁盘空间不足了,du -h 查看了一下磁盘占用情况,发现是自己的docker镜像全部放/var/lib/docker目录下 这个系统磁盘给根目录只分配了5 ...
- pthread库的使用
目录 1.说明 2.使用 2.1.pthread_create 2.2.pthread_join 2.3.pthread_exit 2.4.pthread_self 2.5.pthraad_detac ...
- koreanDollLikeness_v10模型下载及使用
koreanDollLikeness_v10模型 前几天给大家提供了koreanDollLikeness_v15模型的下载,最近小卷终于找到koreanDollLikeness_v10模型啊.先来说说 ...
- Linux Shell获取指定日期 N 天/月/年前(后)的日期
我们有时候在写批处理 Shell 脚本时,可能需要获取指定日期前(后) N 天/月/年的日期,这里的 N 可以是 1 天/月/年.2 天/月/年.3 天/月/年等等.方法其实很简单,这里做一个简单记录 ...
- P2898 [USACO08JAN] Haybale Guessing G 题解
题目传送门 前置知识 二分答案 | 并查集 解法 对条件的合法性判断其他题解已经讲得很明白了,这里不再赘述.这里主要讲一下用并查集实现黑白染色问题. 以下内容称被覆盖为黑色,不被覆盖为白色. 本题因为 ...
- NC16527 [NOIP2013]货车运输
题目链接 题目 题目描述 A 国有 n 座城市,编号从 1 到 n ,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆 ...
- 【Unity3D】UGUI概述
1 UGUI 与 GUI 区别 GUI控件 在编译时不能可视化,并且界面不太美观,在实际应用中使用的较少.UGUI 在编译时可视化,界面美观,实际应用较广泛. 2 Canvas 渲染模式(Rend ...
- 使用多层RNN-LSTM网络实现MNIST数据集分类及常见坑汇总
1 前言 循环神经网络(Recurrent Neural Network, RNN)又称递归神经网络,出现于20世纪80年代,其雏形见于美国物理学家J.J.Hopfield于1982年提出的可作联想存 ...