题目描述

学校的自助午餐提供圆形和方形的三明治,分别用数字 0 和 1 表示。所有学生站在一个队列里,每个学生要么喜欢圆形的要么喜欢方形的。
餐厅里三明治的数量与学生的数量相同。所有三明治都放在一个 栈 里,每一轮:如果队列最前面的学生 喜欢 栈顶的三明治,那么会 拿走它 并离开队列。
否则,这名学生会 放弃这个三明治 并回到队列的尾部。
这个过程会一直持续到队列里所有学生都不喜欢栈顶的三明治为止。给你两个整数数组 students 和 sandwiches ,其中 sandwiches[i] 是栈里面第 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[i] 要么是 0 ,要么是 1 。
students[i] 要么是 0 ,要么是 1 。

解题思路

  1. 这道题目有多种实现方式,比如:栈、双端队列、计数,但是核心思路就是根据题目的意思进行模拟。
  2. 实现思路1:选用双端队列来实现会更加容易,但是,我们需要注意的是结束条件,结束条件:当我们的所有学生都没有拿到栈顶的面包,此时直接return,此时需要去维护一个变量,判断它的值是否与此时队列的长度是否相等。
  3. 实现思路2:因为学生在队列的相对位置不影响整个过程,我们只需要记录队列剩余的学生中0的个数,以及1的个数,只要当前学生中0或者1的数量大于0,就减减,否则,直接break,最后直接return
    返回0和1的数量。

实现代码

实现方式一:队列

class Solution {public int countStudents(int[] students, int[] sandwiches) {Deque<Integer> stu=new LinkedList<>();for(int i=students.length-1;i>=0;i--){stu.addFirst(students[i]);}int t=0,index=0;while(!stu.isEmpty()){if(t==stu.size()){return stu.size();}int student = stu.pollFirst();if(student==sandwiches[index]){t=0;index++;}else{stu.addLast(student);t++;}}return 0;}
}

实现方式2:计数

class Solution {public int countStudents(int[] students, int[] sandwiches) {int cnt1=Arrays.stream(students).sum();int cnt0=students.length-cnt1;for(int i=0;i<sandwiches.length;i++){if(sandwiches[i]==0&&cnt0>0){cnt0--;}else if(sandwiches[i]==1&&cnt1>0){cnt1--;}else{break;} }return cnt0+cnt1;}
}

运行结果

【无法吃午餐的学生数量】相关推荐

  1. Leetcode1700. 无法吃午餐的学生数量[C++题解]:模拟题简单,用queue

    文章目录 题目分析 题目链接 补充 Queue的操作 题目分析 题意重述:排队领食物,食物2种属性:学生有唯一偏好.如果学生看到食物队头是自己喜欢吃的,拿走:如果学生看到食物队头不是自己喜欢吃的,掉头 ...

  2. LeetCode 1700. 无法吃午餐的学生数量(队列模拟 / 不模拟)

    文章目录 1. 题目 2. 解题 1. 题目 学校的自助午餐提供圆形和方形的三明治,分别用数字 0 和 1 表示. 所有学生站在一个队列里,每个学生要么喜欢圆形的要么喜欢方形的. 餐厅里三明治的数量与 ...

  3. 1700. 无法吃午餐的学生数量

    学校的自助午餐提供圆形和方形的三明治,分别用数字 0 和 1 表示.所有学生站在一个队列里,每个学生要么喜欢圆形的要么喜欢方形的. 餐厅里三明治的数量与学生的数量相同.所有三明治都放在一个 栈 里,每 ...

  4. 1700. 无法吃午餐的学生数量(难度:简单)

    题目链接:https://leetcode.cn/problems/number-of-students-unable-to-eat-lunch/ 题目描述: 学校的自助午餐提供圆形和方形的三明治,分 ...

  5. 无法吃午餐的学生数量

    题目链接 无法吃午餐的学生数量 题目描述 注意 students.length == sandwiches.length 两个数组中的元素都要么为0,要么为1 解答思路 学生的位置可变,三明治的位置不 ...

  6. LeetCode 1700. 无法吃午餐的学生数量:真假模拟(极简代码) + 奇技淫巧

    [LetMeFly]1700.无法吃午餐的学生数量:真假模拟(极简代码) + 奇技淫巧 力扣题目链接:https://leetcode.cn/problems/number-of-students-u ...

  7. [猴子摘桃 ]有一只猴子,摘了很多桃子,每天吃下全部桃子数量一半+1, 第十天吃完之后发现还剩下1个,问:最初摘了多少

    解析:第一天的桃子数量等于第二天的桃子数量加一乘以二,以此类推. package com.homework;public class Demo17 {public static void main(S ...

  8. 吉林大学计算机学院校区环境,吉林大学,6个校区7个校园,占地面积最大,学生数量最多!...

    吉林大学简称"吉大",位于吉林省省会长春,是教育部直属.中央直管副部级建制的全国重点大学,国家"双一流"."211工程"."985 ...

  9. mysql统计每周每个学校新增学生数量_深入学习之mysql(四)聚合函数

    聚合函数:COUNT统计记录的条数.SUM求和函数.AVG求平均值.MAX求最大值.MIN求最小值 一.COUNT练习: 1.统计学校一共有多少个学生: mysql> SELECT COUNT( ...

最新文章

  1. (转)记忆杭州中的(非杭户籍人)
  2. 禅道设置bug模板_JPress v3.0 beta.2 发布,修复 bug 和完善产品细节
  3. 顺序队列相关操作(C语言实现)
  4. gitlab开启https加密 and 全站https
  5. Xamarin.Forms教程下载安装Xamarin.iOS
  6. Quartz框架架构
  7. Qtum量子链AUR开发工具包即日上线
  8. linux下printf语句执行时间,linux下printf中\n刷新缓冲区的疑问(已解决)
  9. 2016科学数据大会临时通知
  10. linux定时器tinner,第三章 套接字相关数据结构--基于Linux3.10
  11. 月租最便宜的手机卡_有什么价格便宜,月租少,流量多,并且可以从旧套餐转入的手机卡推荐?...
  12. n进制快速转化成10进制
  13. 吉首大学第十届“新星杯”大学生程序设计大赛(暨新生网络同步赛)
  14. erp是企业内部最重要的使用程序,它对日常运作至关重要
  15. 基础30讲 第11讲 多元函数微分学
  16. IP数据包在网络中的传输过程
  17. GDP越高就越幸福吗?用Python分析《世界幸福指数报告》后我们发现…
  18. java中定义byte数组,浅谈java的byte数组的不同写法
  19. 剑指offer练习日志02:基于矩阵乘法求斐波那契数列通项
  20. 【背包dp】自然数拆分Lunatic版

热门文章

  1. UE游戏制作记录(一、ik动画重定向)
  2. 什么是XML?什么是XML数字签名?
  3. Android开发 之 线性渲染 LinearGradient
  4. counter counters 计数器
  5. 友友车友软件 android,友友车友模拟学车软件2013 v4.0最新版(图文)
  6. android java kindle_Kindle和Android开发的比较:Java实现
  7. JAVA刷网站流量的技术研究总结
  8. Juniper防火墙系列-04-Juniper防火墙IPSec VPN的配置
  9. 小马识途谈如何利用全网营销打造营销闭环
  10. 博洛尼亚大学计算机科学,2021QS世界大学学科排名重磅发布!意大利大学详细上榜排名,不容错过!...