class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param students int整型vector
* @param sandwiches int整型vector
* @return int整型
*/
int countStudents(vector<int>& students, vector<int>& sandwiches) {
// write code here
//本题有两种思路,此为第一种
//本题第一、第二种解分别来自“追风的雨汀”和“Silencer76”,笔者在看过思路后敲出,
//所以仅分享自己的思考,如有侵权联系删除!
//第一种解法很直观,就是模拟两个队列的出入
queue<int> a,b;//先定义两个队列
for(int i=0;i<students.size();i++)
{
a.push(students[i]);
b.push(sandwiches[i]);//将学生和三明治的数据分别入列
}
int k{};//计数器,用于记录学生队列的移动次数
while(!a.empty())//如果学生的队列非空
{
if(a.front()==b.front())//此时需要判断两者队首是否相同,相同则双双出队
{
a.pop();
b.pop();
k=0;//将队列的移动次数归零
}
else if(a.front()!=b.front()&&k!=a.size())
//如果两个队首不同,将a的队首移到队尾,实现如下
//后面的&&k!=a.size()很重要,因为else-if是从上到下,如果没有这句会陷入死循环
//如果不想写这句附加判断,实测将下面两个else-if调换位置也能通过
{
a.push(a.front());
a.pop();
k++;
}
else if(k==a.size())
//最后如果操作的次数达到a的长度,说明所有人都已经尝试过
//跟b的队首配对且都失败,此时退出循环
{
break;
}
}
return a.size();
//以下是第二种解法
// int count[2]={0};//先定义count用于记录喜欢0型和1型的人数
// for(int num:students)
// {
// count[num]++;
// }
//上面这个用法对于遍历数组特别方便,相当于
/*
for(int i=students.begin();i<students.end();i++)
{
int num=students(i)
count[num]++;
}
*/
//也就是定义一个变量num,对数组students的元素从左到右进行遍历,
//以上这段的意思是将对应的学生数量加加
//以下则是喜欢对应三明治的学生减减
// for(int num: sandwiches)
// {
// if(count[num]>0)//要注意大于0的条件,这说明栈顶的东西还有学生喜欢,否则就跳出循环
// count[num]--;
// else
// break;
// }
// int sum=count[0]+count[1];//剩余学生数量就是两个对应喜欢数量剩余人数的和
// return sum;
}
};