标题:
学校的自助午餐提供圆形和方形的三明治,分别用数字 0 和 1 表现。全部门生站在一个队列里,每个门生要么喜好圆形的要么喜好方形的。
餐厅里三明治的数目与门生的数目雷同。全部三明治都放在一个 栈 里,每一轮:
如果队列最前面的门生 喜好 栈顶的三明治,那么会 拿走它 并离开队列。
否则,这王谢生会 放弃这个三明治 并回到队列的尾部。
这个过程会不绝连续到队列里全部门生都不喜好栈顶的三明治为止。
给你两个整数数组 students 和 sandwiches ,其中 sandwiches 是栈内里第 i 个三明治的范例(i = 0 是栈的顶部), students[j] 是初始队列里第 j 王谢生对三明治的喜好(j = 0 是队列的最开始位置)。请你返回无法吃午餐的门生数目。
示例 1:
输入:students = [1,1,0,0], sandwiches = [0,1,0,1]
输出:0
表明:
- 最前面的门生放弃最顶上的三明治,并回到队列的末端,门生队列变为 students = [1,0,0,1]。
- 最前面的门生放弃最顶上的三明治,并回到队列的末端,门生队列变为 students = [0,0,1,1]。
- 最前面的门生拿走最顶上的三明治,剩余门生队列为 students = [0,1,1],三明治栈为 sandwiches = [1,0,1]。
- 最前面的门生放弃最顶上的三明治,并回到队列的末端,门生队列变为 students = [1,1,0]。
- 最前面的门生拿走最顶上的三明治,剩余门生队列为 students = [1,0],三明治栈为 sandwiches = [0,1]。
- 最前面的门生放弃最顶上的三明治,并回到队列的末端,门生队列变为 students = [0,1]。
- 最前面的门生拿走最顶上的三明治,剩余门生队列为 students = [1],三明治栈为 sandwiches = [1]。
- 最前面的门生拿走最顶上的三明治,剩余门生队列为 students = [],三明治栈为 sandwiches = []。
以是全部门生都有三明治吃。
示例 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 要么是 0 ,要么是 1 。
students 要么是 0 ,要么是 1 。
思绪:
假设喜好吃圆形三明治的门生数目为 s_0,喜好吃方形三明治的门生数目为 s_1。根据题意,我们可以知道栈顶的三明治可否被拿走取决于队列剩余的门生中是否有喜好它的,因此门生在队列的相对位置不影响整个过程,我们只须要记录队列剩余的门生中 s_0和 s_1的值。我们对整个过程举行模拟,如果栈顶的元素为 0 而且 s_0 >0, 将s0减1, 如果栈顶元素是1而且s1>0, 将s1减1. 否则停止遍历,并返回s0+s1
java代码:
class Solution { public int countStudents(int[] students, int[] sandwiches) { int s1 = Arrays.stream(students).sum(); int s0 = students.length - s1; for (int i = 0; i < sandwiches.length; i++) { if (sandwiches == 0 && s0 > 0) { s0--; } else if (sandwiches == 1 && s1 > 0) { s1--; } else { break; } } return s0 + s1; }} |