2023-10-14:用go语言,给定 pushed 和 popped 两个序列,每个序列中的 值都不重复, 只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时, 返回
2023-10-14:用go语言,给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,
只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,
返回 true;否则,返回 false 。
输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]。
输出:true。
来自美团。
来自左程云。
答案2023-10-14:
大体过程如下:
1.初始化一个栈stack和索引指针i、j,分别指向pushed和popped的起始位置。
2.遍历pushed数组,将当前元素pushed[i]入栈,同时i自增1。
3.在入栈后,检查栈顶元素是否与popped[j]相等。若相等,则表示栈顶元素需要出栈,因此将栈顶元素出栈,同时j自增1。
4.重复步骤2和步骤3,直到遍历完pushed数组。
5.最后,判断栈是否为空。若栈为空,则返回true;否则,返回false。
时间复杂度分析:遍历pushed数组的时间复杂度为O(n),其中n为数组的长度。在每次遍历中,判断栈顶元素是否需要出栈的时间复杂度为O(1)。因此,总的时间复杂度为O(n)。
空间复杂度分析:仅使用了常数级别的额外空间,因此额外空间复杂度为O(1)。
go完整代码如下:
package main
import "fmt"
func validateStackSequences(pushed []int, popped []int) bool {
n := len(pushed)
size := 0
for i, j := 0, 0; i < n; i++ {
pushed[size] = pushed[i]
size++
for size > 0 && j < n && pushed[size-1] == popped[j] {
size--
j++
}
}
return size == 0
}
func main() {
pushed := []int{1, 2, 3, 4, 5}
popped := []int{4, 5, 3, 2, 1}
result := validateStackSequences(pushed, popped)
fmt.Println(result)
}

rust完整代码如下:
fn validate_stack_sequences(pushed: Vec<i32>, popped: Vec<i32>) -> bool {
let n = pushed.len() as i32;
let mut size = 0;
let mut pushed = pushed; // Make pushed mutable
let mut j = 0;
for i in 0..n {
pushed[size as usize] = pushed[i as usize];
size += 1;
while size > 0 && j < n && pushed[(size - 1) as usize] == popped[j as usize] {
size -= 1;
j += 1;
}
}
size == 0
}
fn main() {
let pushed = vec![1, 2, 3, 4, 5];
let popped = vec![4, 5, 3, 2, 1];
let result = validate_stack_sequences(pushed, popped);
println!("{}", result);
}

c++完整代码如下:
#include <iostream>
#include <vector>
using namespace std;
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
int n = pushed.size();
int size = 0;
for (int i = 0, j = 0; i < n; i++) {
// i : 入栈数组,哪个位置的数要进栈
// j : 出栈数组,对比的位置
pushed[size++] = pushed[i];
while (size > 0 && j < n && pushed[size - 1] == popped[j]) {
size--;
j++;
}
}
return size == 0;
}
int main() {
vector<int> pushed = { 1, 2, 3, 4, 5 };
vector<int> popped = { 4, 5, 3, 2, 1 };
bool result = validateStackSequences(pushed, popped);
cout << boolalpha << result << endl;
return 0;
}

c完整代码如下:
#include <stdio.h>
#include <stdbool.h>
bool validateStackSequences(int* pushed, int pushedSize, int* popped, int poppedSize) {
int size = 0;
for (int i = 0, j = 0; i < pushedSize; i++) {
pushed[size++] = pushed[i];
while (size > 0 && j < poppedSize && pushed[size - 1] == popped[j]) {
size--;
j++;
}
}
return size == 0;
}
int main() {
int pushed[] = { 1, 2, 3, 4, 5 };
int popped[] = { 4, 5, 3, 2, 1 };
int pushedSize = sizeof(pushed) / sizeof(pushed[0]);
int poppedSize = sizeof(popped) / sizeof(popped[0]);
bool result = validateStackSequences(pushed, pushedSize, popped, poppedSize);
printf("%s\n", result ? "true" : "false");
return 0;
}

2023-10-14:用go语言,给定 pushed 和 popped 两个序列,每个序列中的 值都不重复, 只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时, 返回的更多相关文章
- selenium - 弹出框操作
# 6. 弹出框操作 # 6.1 页面弹出框操作# 页面弹出框 是一个html页面的元素,由用户在页面的操作触发弹出# (1)执行触发操作之后,等待弹出框出现之后,# (2)再定位弹出框中的元素并操作 ...
- 如何设置secureCRT的鼠标右键为弹出文本操作菜单功能
secureCRT的鼠标右键功能默认是粘贴的功能,用起来和windows系统的风格不一致, 如果要改为右键为弹出文本操作菜单功能,方便对选择的内容做拷贝编辑操作,可以在 options菜单----&g ...
- CKFinder 弹出窗口操作并设置回调函数
CKFinder 弹出窗口操作并设置回调函数 官方例子参考CKFinderJava-2.4.1/ckfinder/_samples/popup.html 写一个与EXT集成的小例子 Ext.defin ...
- bootstrap 弹出框点击其他区域时弹出框不消失选项设置
默认情况下,bootstrap 弹出框点击其他区域时,弹出框会自动关闭,在很多时候,我们可能会希望达到和原生弹出框一样的效果,避免不小心点击其他区域时弹框自动隐藏,尤其是对于一些复杂的表单,重复填写可 ...
- ArcGIS 添加 MarkerSymbol 弹出“图形符号无法序列化为 JSON”错误
今天在做一个demo,向自定义图层中添加MarkerSymbol的时候,弹出“图形符号无法序列化为 JSON”错误,之前都没有出现过这个问题,我们首先来看一看我是怎样去添加图层,然后向图层中添加Gra ...
- 网页上弹出pop窗口实例,(document).height()与$(window).height()的区别
#dvbg{background-color:#666666; position:absolute; z-index:99; left:0; top:0; display:none; width:10 ...
- jquery的Layer弹出框操作
在layer中,我们要先获取窗口的索引,然后再进行操作. var index = parent.layer.getFrameIndex(window.name); //获取窗口索引 $("# ...
- 关于winform窗体关闭时弹出提示框,选择否时窗体也关闭的问题
在窗体中有FormClosing这个事件,这个事件是在窗体关闭时候运行的.如果要取消某个事件的操作,那么就在该事件中写上e.Cancel=true就能取消该事件,也就是不执行该事件.所以,你要在窗体关 ...
- 页面弹出全屏浮层或遮罩时,禁止底层body滚动
· 解决方法 针对弹出的浮层的 touchmove事件,添加阻止浏览器默认行为. $('.mask-wrapper').on('touchmove', function (event) { // 监听 ...
- easyui-prompt弹出框操作
效果图如下: 代码如下: $(document).ready(function () { //绑定按钮操作 $('#btnMove').click(function () { var ids = ge ...
随机推荐
- hashtable分析
1.什么是Hash表? Hash表又被称为散列表,是根据关键码值(key-value)也就是键值对来直接访问的一种数据结构.也就是说,它通过把关键码值映射到表中的一个位置来访问记录,用以加快查找的 ...
- Visual Studio Code调试和发布ASP.NET Core Web应用
前言 上一篇文章主要讲了Visual Studio Code安装C#开发工具包并编写ASP.NET Core Web应用有兴趣的同学可以去看看,今天咱们主要是要讲讲如何在VS Code中调试和发布AS ...
- 【WebRtc】获取音视频数据
首页截图 获取音视频 关键Code 获取摄像头数据 /** * 获取流数据 */ openUserMeida() { var that = this // 判断是否支持获取媒体数据 if (!navi ...
- Java IO流 - 字节流的使用详细介绍
IO流的基本介绍: IO流的概述: i 表示intput,是数据从硬盘文件读入到内存的过程,称之输入,负责读. o 表示output,是内存程序的数据从内存到写出到硬盘文件的过程,称之输出,负责写. ...
- 图像处理_Retinex图像增强
单尺度SSR (Single Scale Retinex) 图像 S ( x , y ) S(x,y) S(x,y)分解为两个不同的图像:反射图像 R ( x , y ) R(x,y) R(x,y), ...
- 进程相关API
ID与句柄 如果我们成功创建一个进程,CreateProcess函数会给我们返回一个结构体,包括四个数 据:进程编号(ID).进程句柄.线程编号(ID).线程句柄. 进程ID其实我们早见过了,通常我们 ...
- 图解 Vue 响应式原理
Vue 初始化 模板渲染 组件渲染 为了便于理解,本文将从以下两个方面进行探索: 从 Vue 初始化,到首次渲染生成 DOM 的流程. 从 Vue 数据修改,到页面更新 DOM 的流程. Vue 初始 ...
- 记录一次线上服务CPU飙高问题
2023.07.20 20:01:38线上一个服务发生了CPU过高的告警, 看告警信息当前的CPU使用率已经达到了82.65%,问题已经很严重,赶紧开始排查起来.来复盘下如何排查这类问题, 一.排查方 ...
- test20230304考试总结(2023春 · 字符串)
前言 赛时得分明细: A B C D Total Rank 100 100 0 70 270 2 C题如此说道:字符串没有学好的报应!! A. P4391 [BOI2009]Radio Transmi ...
- asp.net core之异常处理
在开发过程中,处理错误是一个重要的方面.ASP.NET Core提供了多种方式来处理错误,以确保应用程序的稳定性和可靠性. TryCatch TryCatch是最常见也是最基础的一种异常处理方式,只需 ...