• 图解LeetCode——1700. 无法吃午餐的学生数量(难度:简单)


    一、题目

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

    • 如果队列最前面的学生 喜欢 栈顶的三明治,那么会 拿走它 并离开队列。
    • 否则,这名学生会 放弃这个三明治 并回到 队列的尾部

    这个过程会一直持续到队列里所有学生都不喜欢栈顶的三明治为止。 给你两个整数数组 students 和 sandwiches ,其中 sandwiches[i] 是栈里面第 i 个三明治的类型(i = 0 是栈的顶部), students[j] 是初始队列里第 j 名学生对三明治的喜好(j = 0 是队列的最开始位置)。请你返回无法吃午餐的学生数量。

    二、示例

    2.1> 示例 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.2> 示例 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 。

    三、解题思路

    题目描述说了很多,但其实是很好理解的,不会像某些题目描述不清,审题理解需要10多分钟……

    其实通过题目描述,我们可以知道这两个数组studentssandwiches各有彼此的特点:

    students数组:它就像一把左轮手枪中的子弹一样,只要我们一次次的扣动扳机,每颗子弹我们都有机会发射出去,我们甚至可以将其认为数组中的每个元素,都是平行放在桌子上的,没有什么优先级可言。它是偏动态的。
    sandwiches数组:更像靶场的靶子,如果“击中”了,才会更换。而它是有被更换的次序的。它是偏静态的。

    那么,题目要求只有students[i]与sandwiches[j]相同的时候,才更换靶子。那么我们其实可以先统计出students数组中“0”的个数(zeroCount)和“1”的个数(oneCount)。然后,我们再将视角切换到sandwiches数组中,从头开始遍历它的元素(即:靶子)。如果是“0”,那么zeroCount减1,否则,oneCount减1。当发现zeroCountzeroCount为-1的时候,则返回两者中最大的那个值,就是无法吃到午餐的学生数量。

    由于本题逻辑并不复杂,所以就免去画图的步骤了。具体实现,请见如下代码实现部分。

    四、代码实现

    1. class Solution {
    2.     public int countStudents(int[] students, int[] sandwiches) {
    3.         int oneCount = 0, zeroCount = 0;
    4.         for (int student : students) {
    5.             if (student == 0) zeroCount++
    6.             else oneCount++;
    7.         }
    8.         for (int i = 0; i < sandwiches.length; i++) {
    9.             if (sandwiches[i] == 0) zeroCount--; 
    10.             else oneCount--;
    11.             if (zeroCount == -1 || oneCount== -1return Math.max(zeroCount, oneCount);
    12.         }
    13.         return 0;
    14.     }
    15. }

    今天的文章内容就这些了:

    写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

    更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

  • 相关阅读:
    Mybatis基础支持层-反射模块:ObjectFactory/Property工具类
    CompletableFuture异步编排(两任务组合——两个任务必须都完成才触发另一个任务 )
    代码检视的新姿势!在IDEA中得到沉浸式Code Review新体验
    【力扣周赛】第 112 场双周赛
    OpenHarmony Trace的使用
    有创意且简美大气的图表-堆叠极扇图
    TFA-aminolinker C6 phosphoramidite,CAS number: 133975-85-6;TFA氨基聚合物C6磷酰胺
    【实操】基于ChatGPT构建知识库
    QT+OSG/osgEarth编译之十三:libSSH2+Qt编译(一套代码、一套框架,跨平台编译,版本:libSSH2-1.10.0)
    ssh终端工具推荐-WindTerm
  • 原文地址:https://blog.csdn.net/qq_26470817/article/details/127404648