The school cafeteria offers circular and square sandwiches at lunch break, referred to by numbers 0 and 1 respectively. All students stand in a queue. Each student either prefers square or circular sandwiches.
The number of sandwiches in the cafeteria is equal to the number of students. The sandwiches are placed in a stack. At each step:
If the student at the front of the queue prefers the sandwich on the top of the stack, they will take it and leave the queue.
Otherwise, they will leave it and go to the queue's end.
This continues until none of the queue students want to take the top sandwich and are thus unable to eat.
You are given two integer arrays students and sandwiches where sandwiches[i] is the type of the ith sandwich in the stack (i = 0 is the top of the stack) and students[j] is the preference of the jth student in the initial queue (j = 0 is the front of the queue). Return the number of students that are unable to eat.
Example 1:
Input: students = [1,1,0,0], sandwiches = [0,1,0,1]
Output: 0
Explanation:
- Front student leaves the top sandwich and returns to the end of the line making students = [1,0,0,1].
- Front student leaves the top sandwich and returns to the end of the line making students = [0,0,1,1].
- Front student takes the top sandwich and leaves the line making students = [0,1,1] and sandwiches = [1,0,1].
- Front student leaves the top sandwich and returns to the end of the line making students = [1,1,0].
- Front student takes the top sandwich and leaves the line making students = [1,0] and sandwiches = [0,1].
- Front student leaves the top sandwich and returns to the end of the line making students = [0,1].
- Front student takes the top sandwich and leaves the line making students = [1] and sandwiches = [1].
- Front student takes the top sandwich and leaves the line making students = [] and sandwiches = [].
Hence all students are able to eat.
Example 2:
Input: students = [1,1,1,0,0,1], sandwiches = [1,0,0,0,1,1]
Output: 3
Constraints:
1 <= students.length, sandwiches.length <= 100
students.length == sandwiches.length
sandwiches[i] is 0 or 1.
students[i] is 0 or 1.
这题有点儿麻烦,写完后感觉代码好多,虽然性能貌似挺好的。
首先计算出需要0三明治和1三明治的学生数量,然后进行循环匹配。当没有人要0或者1三明治并且三明治只有0和1的情况下,说明没有办法进行分配了。
class NumberOfStudentsUnableToEatLunch : public Solution {
public:
void Exec() {
vector<int> students{1,1,0,0};
vector<int> sandwiches{0,1,0,1};
auto res = countStudents(students, sandwiches);
}
int countStudents(vector<int>& students, vector<int>& sandwiches) {
int sti = -1, sai = 0;
int num0 = 0, num1 = 0;
for (auto v : students) {
if (v == 0) num0++;
else num1++;
}
while (num0 != 0 || num1 != 0) {
int nextSti = (sti + 1) % students.size();
while (students[nextSti] == 2) {
nextSti = (nextSti + 1) % students.size();
}
sti = nextSti;
if (0 == num0 && sandwiches[sai] == 0) {
break;
}
if (0 == num1 && sandwiches[sai] == 1) {
break;
}
if (students[sti] == sandwiches[sai]) {
if (sandwiches[sai] == 0) --num0;
else --num1;
sai++; students[sti] = 2;
}
}
return num0 + num1;
}
};