class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param students int整型vector
* @param sandwiches int整型vector
* @return int整型
*/
int countStudents(vector<int>& students, vector<int>& sandwiches) {
// write code here
queue<int>q;
int i = 0;
// 把students里的数据放到队列q里边
for (int s : students) {
q.push(s);
}
while (!q.empty()) {
if (q.front() == sandwiches[i]) {
q.pop();
i++;
}
// 不相等就往后去
else {
int n = q.size();
while (q.front() != sandwiches[i]) {
q.push(q.front());
q.pop();
n--;
//如果栈里所有的都移动了一遍,还是没有跳出当前while循环,就说明栈里的同学都吃不到,此时返回栈的大小即可,不能返回n,;因为n--时,n已经变化了。
if (n == 0) return q.size();
}
}
}
return 0;
}
};
本来应该是先说思路,再粘贴代码的,但是这个不知道怎么搞得,那就反转一下吧!
1.定义q队列,把数组stu直接赋值给q,否则的话,同时处理两个会显得很啰嗦,还容易因为下标而出错
2.判断q第一个数据和san的第一个是否相等,相等的话就q踢出,san踢出,即下标自增一即可。不用担心下标会溢出,因为最坏的情况就是把san遍历完,
3,接着2。如果不相等的话q就往后排,san是不变的,因为san的第一个只有被踢掉的话,才会往后匹配,这也符合常理,要被一个一个按顺序拿。不断的往后排,直到q里边的全部被往后排了一遍,此时q的大小即是未拿到三明治的同学。此时直接返回即可。



京公网安备 11010502036488号