題目鏈接:https://leetcode.cn/problems/number-of-students-unable-to-eat-lunch/
題目描述:
學(xué)校的自助午餐提供圓形和方形的三明治请祖,分別用數(shù)字 0
和 1
表示土思。所有學(xué)生站在一個(gè)隊(duì)列里,每個(gè)學(xué)生要么喜歡圓形的要么喜歡方形的炮车。
餐廳里三明治的數(shù)量與學(xué)生的數(shù)量相同州胳。所有三明治都放在一個(gè) 棧 里记焊,每一輪:
- 如果隊(duì)列最前面的學(xué)生 喜歡 棧頂?shù)娜髦危敲磿?huì) 拿走它 并離開隊(duì)列栓撞。
- 否則遍膜,這名學(xué)生會(huì) 放棄這個(gè)三明治 并回到隊(duì)列的尾部。
這個(gè)過程會(huì)一直持續(xù)到隊(duì)列里所有學(xué)生都不喜歡棧頂?shù)娜髦螢橹埂?/p>
給你兩個(gè)整數(shù)數(shù)組 students
和 sandwiches
瓤湘,其中 sandwiches[i]
是棧里面第 i
個(gè)三明治的類型(i = 0
是棧的頂部)瓢颅, students[j]
是初始隊(duì)列里第 j
名學(xué)生對(duì)三明治的喜好(j = 0
是隊(duì)列的最開始位置)。請(qǐng)你返回?zé)o法吃午餐的學(xué)生數(shù)量岭粤。
示例 1:
輸入:students = [1,1,0,0], sandwiches = [0,1,0,1]
輸出:0
解釋:
- 最前面的學(xué)生放棄最頂上的三明治惜索,并回到隊(duì)列的末尾,學(xué)生隊(duì)列變?yōu)?students = [1,0,0,1]剃浇。
- 最前面的學(xué)生放棄最頂上的三明治巾兆,并回到隊(duì)列的末尾猎物,學(xué)生隊(duì)列變?yōu)?students = [0,0,1,1]。
- 最前面的學(xué)生拿走最頂上的三明治角塑,剩余學(xué)生隊(duì)列為 students = [0,1,1]蔫磨,三明治棧為 sandwiches = [1,0,1]。
- 最前面的學(xué)生放棄最頂上的三明治圃伶,并回到隊(duì)列的末尾堤如,學(xué)生隊(duì)列變?yōu)?students = [1,1,0]。
- 最前面的學(xué)生拿走最頂上的三明治窒朋,剩余學(xué)生隊(duì)列為 students = [1,0]搀罢,三明治棧為 sandwiches = [0,1]。
- 最前面的學(xué)生放棄最頂上的三明治侥猩,并回到隊(duì)列的末尾榔至,學(xué)生隊(duì)列變?yōu)?students = [0,1]。
- 最前面的學(xué)生拿走最頂上的三明治欺劳,剩余學(xué)生隊(duì)列為 students = [1]唧取,三明治棧為 sandwiches = [1]。
- 最前面的學(xué)生拿走最頂上的三明治划提,剩余學(xué)生隊(duì)列為 students = []枫弟,三明治棧為 sandwiches = []。
所以所有學(xué)生都有三明治吃鹏往。
示例 2:
輸入:students = [1,1,1,0,0,1], sandwiches = [1,0,0,0,1,1]
輸出:3
提示:
1 <= students.length, sandwiches.length <= 100
students.length == sandwiches.length
-
sandwiches[i]
要么是0
淡诗,要么是1
。 -
students[i]
要么是0
掸犬,要么是1
袜漩。
解法:堆棧 + 模擬
使用兩個(gè)堆棧studentsStack 和sandwichesStack分別來模擬學(xué)生隊(duì)列和三明治隊(duì)列绪爸。當(dāng)隊(duì)首元素相同時(shí)湾碎,都推出隊(duì)首元素,開始比較下一個(gè)隊(duì)首元素奠货。否則介褥,讓學(xué)生隊(duì)列的隊(duì)首移動(dòng)到隊(duì)尾,繼續(xù)比較递惋,直到所有元素都匹配不上或者所有元素都已出棧柔滔,退出循環(huán),studentsStack 最后剩余的大小就是無法吃午餐的學(xué)生數(shù)量萍虽。
代碼:
class Solution {
public int countStudents(int[] students, int[] sandwiches) {
Deque<Integer> studentsStack = new ArrayDeque<>();
Deque<Integer> sandwichesStack = new ArrayDeque<>();
for (int student : students) {
studentsStack.offerLast(student);
}
for (int sandwich : sandwiches) {
sandwichesStack.offerLast(sandwich);
}
boolean flag = true;
while (!sandwichesStack.isEmpty() && flag) {
flag = false;
int len = studentsStack.size();
while (!studentsStack.isEmpty() && len-- > 0) {
if(sandwichesStack.peekFirst() == studentsStack.peekFirst()) {
sandwichesStack.pollFirst();
studentsStack.pollFirst();
flag = true;
} else {
studentsStack.offerLast(studentsStack.pollFirst());
}
}
}
return sandwichesStack.size();
}
}