写点什么

2023-10-14:用 go 语言,给定 pushed 和 popped 两个序列,每个序列中的 值都不重复, 只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时, 返回

  • 2023-10-14
    广东
  • 本文字数:1728 字

    阅读完需:约 6 分钟

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;}
复制代码



发布于: 刚刚阅读数: 3
用户头像

公众号:福大大架构师每日一题 2021-02-15 加入

公众号:福大大架构师每日一题

评论

发布
暂无评论
2023-10-14:用go语言,给定 pushed 和 popped 两个序列,每个序列中的 值都不重复, 只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时, 返回_福大大架构师每日一题_福大大架构师每日一题_InfoQ写作社区