验证图书取出顺序
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 60 ms, 内存: 15.1 MB
/*
* 思路:
* 使用一个栈来模拟图书放入和拿取的过程。
* 遍历putIn序列,将每本书放入栈中。
* 每次放入后,检查栈顶元素是否与takeOut序列的当前元素相同。
* 如果相同,则将栈顶元素出栈,并移动takeOut序列的指针。
* 最终如果栈为空且takeOut序列的指针指向末尾,说明takeOut序列是有效的。
*/
import java.util.Stack;
import java.util.stream.IntStream;
public class ValidateStackSequencesStream {
public boolean validateStackSequences(int[] putIn, int[] takeOut) {
Stack<Integer> stack = new Stack<>();
int[] j = {0};
IntStream.of(putIn).forEach(book -> {
stack.push(book);
while (!stack.isEmpty() && stack.peek() == takeOut[j[0]]) {
stack.pop();
j[0]++;
}
});
return stack.isEmpty();
}
}
解释
方法:
这个题解利用了一个栈来模拟书籍放入和拿取的过程。每次循环遍历放入序列,将元素推入栈中,然后检查栈顶元素是否与拿取序列当前指向的元素相同。如果相同,就从栈中弹出这个元素,并将拿取序列的指针向前移动。这个过程重复进行,直到放入序列遍历完成。最后,如果栈为空,则意味着拿取序列可以完全按照给定的顺序从栈中拿出所有书籍,返回true;如果栈不为空,返回false。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在模拟过程中要用栈来表示书架,而不是其他数据结构如队列或链表?
▷🦆
题解中提到的`while stack and stack[-1] == popped[i]`循环是如何确保拿取顺序正确的?
▷🦆
如果输入的拿取序列与放入序列长度不同,这个算法应该如何处理?
▷🦆
算法中有没有可能出现栈中元素与拿取序列当前元素不匹配,但最终还是返回true的情况?
▷