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. 在mac中双击执行python

    执行python脚本 mac有内置的python,但还是建议你自己安装一个python,如果没有卸载mac自带的python2.7,当你需要使用python3执行脚本时,python命令需要改为pyt ...

  2. Vue双向数据绑定原理-上

    Vue响应式的原理(数据改变界面就会改变)是什么? 时时监听数据变化, 一旦数据发生变化就更新界面, 这就是Vue响应式的原理. Vue是如何实现时时监听数据变化的 通过原生JS的defineProp ...

  3. TienChin-系统功能介绍

    线索管理 添加线索 查看线索 删除线索 修改线索 分配线索: ​将录入到系统的线索,分配给某一个市场专员去处理 跟进线索: ​持续跟进一条线索 1.判断是否伪线索 2.持续跟进,每次跟进需要有记录 3 ...

  4. 小白学k8s(10)-k8s中ConfigMap理解

    理解ConfigMap 什么是ConfigMap ConfigMap的创建 使用key-value 字符串创建 从env文件创建 从目录创建 通过Yaml/Json创建 ConfigMap使用 用作环 ...

  5. 深入探索OCR技术:前沿算法与工业级部署方案揭秘

    深入探索OCR技术:前沿算法与工业级部署方案揭秘 注:以上图片来自网络 1. OCR技术背景 1.1 OCR技术的应用场景 OCR是什么 OCR(Optical Character Recogniti ...

  6. Linux 应用Kickstart部署系统

    Kickstart 是一种无人值守系统安装方式,其工作原理是预先把原本需要运维人员手工填写的参数保存成文件,当安装过程中需要填写参数时则自动匹配Kickstart生成的文件,所以只要文件内包含了安装过 ...

  7. C/C++ 进程线程操作技术

    手动创建单进程: 下面通过一个实例来分别演示进程的创建函数. #include <windows.h> #include <stdio.h> BOOL WinExec(char ...

  8. STM32 HAL库 USART DMA驱动

    前言 本文是在使用 STM32L4 的串口 DMA 功能时,使用 HAL 库出现的一些问题,通过以下方式解决了 HAL 库中存在 DMA 发送和接收的一些问题. STM32L4 的 DMA 简介 DM ...

  9. vue-element-admin iframes 组件 保留 iframe 操作状态

    由于没有时间去维护这个功能,这个仓库我暂停了,当前博客内容和代码只作为实现思路参考 代码贴前面,gitee地址:https://gitee.com/chkhk/vue-element-admin 可以 ...

  10. MQTT-QoS与协议流程

    QoS的报文收发流程 QoS 0 最多交付一次,消息有可能丢失,最低的QoS等级,没有任何的机制,不需要等待确认和重传,只要保证消息发送,也可能到达不了接收端 QoS0消息发送流程: 发送端调用API ...