这道题我是三明治和学生都用了队列,并不像原题那样三明治是栈。
本来我也无比天真,按着题目的说法让三明治为栈,但这就是出题人的阴险之处,我们会发现样例是可以顺利通过的,结果在实际提交时就出错了。思索片刻,我才恍然大悟,三明治序列的样例别有用心的设计为对称性的数据,这意味着无论你是顺序还是逆序入栈,整个栈都是一样的,但是如果换成是10010非对称序列,那么当你程序运行时,三明治弹出的栈顶元素反而是三明治序列从后往前的元素,这和题目的逻辑(从前往后弹出三明治序列的元素)正好相反。
所以,这也是个经验,当设计一个栈并且要将序列的元素压入栈时,一定一定要记得栈的数据排列和序列的排列顺序正好是相反的!而队列的排列顺序才是和序列排列顺序一致。
#include <queue>
#include <stack>
class Solution {
public:
int countStudents(vector<int>& students, vector<int>& sandwiches) {
queue<int>sand;//演都不演了,直接定义三明治也为队列结构,保持和三明治原序列相同的数据排列顺序
queue<int>stu;
int cnt1=0, cnt0=0, summ=0;
for (int & student : students) {// &意味着指针,改变student就能直接改变students数组的元素值。而不加&则是从students里的当前元素拷贝一份出来,并不改变students里的元素,性能低
stu.push(student);
if (student == 1) {
cnt1++;
}
else {//student == 0
cnt0++;
}
summ++;
}
for(int &sandwich : sandwiches){
sand.push(sandwich);
}
while ( !( (cnt0 == 0 && sand.front() == 0) || (cnt1 == 0 && sand.front() == 1) ) ) {
if (sand.front() == stu.front()) {
if (stu.front() == 1) cnt1--;
else cnt0--;
summ--;
stu.pop();
sand.pop();
}
else {
int temp = stu.front();
stu.pop();
stu.push(temp);
}
}
return summ;
}
};

京公网安备 11010502036488号