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:

来自左程云

灵捷3.5

大体步骤如下:

这个问题需要实现一个类 DinnerPlates,其中含有 ConstructorPushPopPopAtStack 四个方法。这个类可以理解成是具有固定容量的多个栈构成的一种数据结构。根据题目描述和提供的 Go 代码文件,这里来分步骤描述大体过程,然后讨论总的时间复杂度和总的空间复杂度。

1.Constructor:

  • 当创建 DinnerPlates 实例时,通过调用 Constructor 方法初始化一个 DinnerPlates 类型的实例。需要传入一个参数 capacity 表示栈的最大容量。在这个方法中,将 capacity 存储到实例字段中,并初始化 stacktoppoppedPos 三个切片。

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的更多相关文章

  1. 【转】具透 | 你可能不知道,iOS 10 有一个中国「特供」的联网权限功能

    9 月底,苹果正式在北京成立了苹果中国研发中心.近几年,我们也在每年更新的 iOS 系统中不断看到,苹果对中国市场的关照.从早前的九宫格输入法,到最近的骚扰电话拦截,都照顾了国内用户的需求. 在 iO ...

  2. 从「Hello World」说起

    标签: node模块 从一个简单「hello world」程序对 node.js 有个感性的认识. const http = requier ('http'); const pathname = '1 ...

  3. 分片利器 AutoTable:为用户带来「管家式」分片配置体验

    在<DistSQL:像数据库一样使用 Apache ShardingSphere>一文中,Committer 孟浩然为大家介绍了 DistSQL 的设计初衷和语法体系,并通过实战操作展示了 ...

  4. 「Usaco2008 Jan」人工湖O(∩_∩)O 纯属的模拟+栈

    题目描述 夏日那让人喘不过气的酷热将奶牛们的烦躁情绪推到了最高点.最终,约翰决定建一个人工湖供奶牛消暑之用. 为了使湖看起来更加真实,约翰决定将湖的横截面建成N(1≤N≤105)个连续的平台高低错落的 ...

  5. loj #2024. 「JLOI / SHOI2016」侦查守卫

    #2024. 「JLOI / SHOI2016」侦查守卫   题目描述 小 R 和 B 神正在玩一款游戏.这款游戏的地图由 nnn 个点和 n−1n - 1n−1 条无向边组成,每条无向边连接两个点, ...

  6. 从开发属于你自己的第一个 Python 库,做一名真正的程序员「双语版」

    你好,我是悦创.之前我在 CSDN 编写了一篇开发 Python 库的教程,有人加我提问到的一些问题,我来更新一下这篇文章:https://blog.csdn.net/qq_33254766/arti ...

  7. 硬吃一个P0故障,「在线业务」应该如何调优HBase参数?

    1.背景 由于种种原因,最近将核心业务生产使用的HBase迁移到了云上的弹性MapReduce(EMR)集群上,并使用了EMR的HBase组件默认参数配置. 结果在流量高峰期出现了宿主机故障,挂掉了两 ...

  8. LaTeX 有哪些「新手须知」的内容?

    孟晨 ,在 LaTeX 话题下写错 LaTeX 名字的,一律… 陈硕等 137 人赞同 这是个好问题,虽然提问提得很大.不是很好答,权当抛砖引玉了. 天字第一号原则:不要到网上抄代码,尤其是似懂非懂的 ...

  9. MongoDB6.0的安装「2023年」

    你好,我是悦创. 优质原文格式:https://bornforthis.cn/column/crawler/supplement/mongodb-install.html 点进去有惊喜. 吐槽,这篇博 ...

  10. 前端构建工具之gulp(一)「图片压缩」

    前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ...

随机推荐

  1. Unity的SpriteAtlas实践

    我的环境 Unity引擎版本:Unity2019.3.7f1 AssetBundles-Browser 于2021-1-14拉取,github上最后提交日期是2019-12-14,在本文简称:ABBr ...

  2. Spring框架源码分析

    目录 Spring核心思想 Spring源码编译 自定义实现Spring框架IOC与DI Spring源码Ioc核心模块分析 BeanDefinition整体介绍 FactoryBean接口的使用 B ...

  3. 路由react-router-dom的使用

    react-router-dom路由简介 现代的前端页面大多是SPA(单页面应用程序), 也就是只有一个HTML页面的程序,这样用户体验好,服务器压力小,所以更受欢迎.路由是使用单页面来管理原来多页面 ...

  4. tp、laravel 伪静态配置

    一.Apache下的伪静态配置 <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine On ...

  5. 教你用JavaScript获取大转盘

    案例介绍 欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个大转盘.当你难以抉择的时候不妨用这个案例来帮你做选择.通过编程实战我们可以学到按钮的 ...

  6. Oracle删除索引规范

    1.背景概述 2.索引删除规范 3.根本解决方案及建议 1.背景概述 近期应用升级上线过程中,存在删除业务表索引的变更操作,且因删除索引导致次日业务高峰时期,数据库响应缓慢的情况,经定位是缺失索引导致 ...

  7. Hive-安装和部署(Hive3.1.2)

    (一)安装前提 (1) 安装JDK1.8及以上版本 (2) 已经安装MySQL,推荐5.7. (3) 已经安装Hadoop. JDK.MySQL.Hadoop的安装,本文不再介绍. (二)安装Hive ...

  8. Hive报错:Call From hadoop01/172.23.238.2 to hadoop01:10020 failed on connection exception

    问题描述 在阿里云服务器上安装的Hadoop和Hive,刚开始关闭了防火墙.但是由于服务器被被黑客安装挖矿程序,所以开启了防火墙.但是即使开启了所有可能的端口,但是在向Hive中插入数据时,依然报错提 ...

  9. Hadoop集群常用组件的命令

    1. Hadoop (1).HDFS:启动HDFS:start-dfs.sh关闭HDFS:stop-dfs.sh格式化NameNode:hdfs namenode -format查看文件系统状态:hd ...

  10. Java-统计程序运行的时长(计算两个时间相差的毫秒数、秒数)

    最近在做Hbase的查询性能验证,需要统计查询的执行时长,所以需要统计开始时间和结束时间的时间差. 下面是使用SimpleDateFormat和Date计算时间差(相差毫秒数)的程序示例,仅供参考. ...