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的大小即是未拿到三明治的同学。此时直接返回即可。