mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-05 16:36:41 +08:00
79 lines
4.0 KiB
Markdown
79 lines
4.0 KiB
Markdown
# [1700. Number of Students Unable to Eat Lunch](https://leetcode.com/problems/number-of-students-unable-to-eat-lunch/)
|
||
|
||
|
||
## 题目
|
||
|
||
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 表示。所有学生站在一个队列里,每个学生要么喜欢圆形的要么喜欢方形的。
|
||
餐厅里三明治的数量与学生的数量相同。所有三明治都放在一个 栈 里,每一轮:
|
||
|
||
- 如果队列最前面的学生 喜欢 栈顶的三明治,那么会 拿走它 并离开队列。
|
||
- 否则,这名学生会 放弃这个三明治 并回到队列的尾部。
|
||
这个过程会一直持续到队列里所有学生都不喜欢栈顶的三明治为止。
|
||
|
||
给你两个整数数组 students 和 sandwiches ,其中 sandwiches[i] 是栈里面第 i 个三明治的类型(i = 0 是栈的顶部), students[j] 是初始队列里第 j 名学生对三明治的喜好(j = 0 是队列的最开始位置)。请你返回无法吃午餐的学生数量。
|
||
|
||
## 解题思路
|
||
|
||
- 简单题。按照题意,学生不管怎么轮流领三明治,如果数量够,经过多轮循环,总能领到。问题可以等价为,学生依次到队列前面领取三明治。2 个种类的三明治都摆好放在那里了。最终领不到三明治的学生都是因为喜欢的三明治不够发放了。按照这个思路,先统计 2 种三明治的总个数,然后减去学生对三明治的需求总数,剩下的学生即都是无法满足的。
|
||
|
||
## 代码
|
||
|
||
```go
|
||
package leetcode
|
||
|
||
func countStudents(students []int, sandwiches []int) int {
|
||
tmp, n, i := [2]int{}, len(students), 0
|
||
for _, v := range students {
|
||
tmp[v]++
|
||
}
|
||
for i < n && tmp[sandwiches[i]] > 0 {
|
||
tmp[sandwiches[i]]--
|
||
i++
|
||
}
|
||
return n - i
|
||
}
|
||
``` |