当前位置: 首页 > news >正文

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

题目描述:

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

如果队列最前面的学生 喜欢 栈顶的三明治,那么会 拿走它 并离开队列。
否则,这名学生会 放弃这个三明治 并回到队列的尾部。
这个过程会一直持续到队列里所有学生都不喜欢栈顶的三明治为止。

给你两个整数数组 students 和 sandwiches ,其中 sandwiches[i] 是栈里面第 i​​​​​​ 个三明治的类型(i = 0 是栈的顶部), students[j] 是初始队列里第 j​​​​​​ 名学生对三明治的喜好(j = 0 是队列的最开始位置)。请你返回无法吃午餐的学生数量。

在这里插入图片描述
在这里插入图片描述

解题思路:

我们可以发现我们实质是每次遍历(以三明治栈顶元素为标准)比较三明治栈顶元素和学生队尾的元素是否相等,再进行接下来的操作。但是我们应该进一步明确不论学生队列如何移动都是要看学生队列目前剩下的是否存在和当前三明治栈顶元素相匹配的元素(更抽象的说就是和学生队列的顺序无关和当前存在的相匹配的个数有关),在明确该点后我们可以进行如下操作:

1.统计学生队列中分别喜欢圆形和三角形三明治的学生人数
2.遍历三明治栈,同时分别判断学生队列中对应的学生人数是否还大于0,若大于0则喜欢对应三明治的人数减一;若已经存在等于0则中断遍历
3最后返回最后剩下的喜欢圆形和方形三明治的人数的总和即为吃不上的人数。

代码:

class Solution {
    // Time Complexity: O(N)
    // Space Complexity: O(1)
    public int countStudents(int[] students, int[] sandwiches) {
        // 统计喜欢不同三明治的人数
        int countSquare = Arrays.stream(students).sum();
        int countCircle = students.length - countSquare;
        for (int i = 0; i < sandwiches.length; i++) {
            if (sandwiches[i] == 1 && countSquare > 0) {
                countSquare--;
            } else if (sandwiches[i] == 0 && countCircle > 0) {
                countCircle--;
            } else {
                break;
            }
        }
        return countCircle + countSquare;
    }
}

相关文章:

  • 用C++实现十大经典排序算法
  • Spring AOP统一功能处理
  • 《Django框架从入门到实战》目录
  • 【华为机试真题详解】信号强度【2022 Q4 | 200分】
  • 【Linux】顶级编辑器Vim的基本使用及配置
  • Servlet 综合案例(empProject)
  • JVM 如何获取当前容器的资源限制?
  • linux之vim编辑器
  • 扩展欧几里得算法 - exgcd
  • 安卓移动端调用自然语言处理nlp模型【示例+源码】
  • 智能车|ROS主控与STM32建立通信软硬件全方位讲解
  • 【MySQL】MySQL基本数据类型
  • 【Docker】(二)使用Dockerfile构建并发布一个SpringBoot服务
  • 前端bug每次都比后端多,我总结了5点原因
  • linux下常用调试技巧
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 77. Combinations
  • emacs初体验
  • git 常用命令
  • If…else
  • Java IO学习笔记一
  • Java 最常见的 200+ 面试题:面试必备
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • JAVA并发编程--1.基础概念
  • log4j2输出到kafka
  • nodejs实现webservice问题总结
  • Redux 中间件分析
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 安装python包到指定虚拟环境
  • 利用jquery编写加法运算验证码
  • 全栈开发——Linux
  • 使用API自动生成工具优化前端工作流
  • 小而合理的前端理论:rscss和rsjs
  • 用 Swift 编写面向协议的视图
  • 7行Python代码的人脸识别
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • ###C语言程序设计-----C语言学习(6)#
  • #、%和$符号在OGNL表达式中经常出现
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #QT(智能家居界面-界面切换)
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (汇总)os模块以及shutil模块对文件的操作
  • (理论篇)httpmoudle和httphandler一览
  • (三分钟)速览传统边缘检测算子
  • (算法)N皇后问题
  • (转)EOS中账户、钱包和密钥的关系
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)详解PHP处理密码的几种方式
  • (轉)JSON.stringify 语法实例讲解
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .net core 6 集成 elasticsearch 并 使用分词器
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析