【刷题之路】LeetCode 1700. 无法吃午餐的学生数量

news2025/1/19 8:21:30

【刷题之路】LeetCode 1700. 无法吃午餐的学生数量

  • 一、题目描述
  • 二、解题
    • 1、思路分析
    • 2、代码实现
      • 2.1、先将队列实现一
      • 2.2、代码实现

一、题目描述

原题连接: 1700. 无法吃午餐的学生数量
题目描述:
学校的自助午餐提供圆形和方形的三明治,分别用数字 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、思路分析

虽然这道题的题目挺长的,但是做起来却很简单,大家应该都能想到这题要用队列来做。
就像题目所描述的那样,我们让所有学生排成一个队列,如果队头学生喜欢的三明治和栈顶的三明治一样,那我们就让队头学生和栈顶的三明治出队和出栈:
在这里插入图片描述
而当队头的学生喜欢的三明治和栈顶的三明治不一样时,我们就将队头的学生转移到队尾(先将队头元素入到队尾,在将队头元素出队):
在这里插入图片描述
那么问题来了,题目要求的结束条件是:“这个过程会一直持续到队列里所有学生都不喜欢栈顶的三明治为止。”
因为队列的规则是先进先出,所以我们每次只能知道队头学生喜欢的三明治类型,而不能知道具体每个学生的喜好,而且根据题目描述队列的长度有可能时时在变化,所以我们也不能单纯的统计个数。
那该怎么解决这个问题呢?
其实,当队列中所有的学生都不喜欢栈顶的三明治时,一定会出现这样的情况,就是会有连续的个数为队列长度的学生都不喜欢栈顶的三明治。所以我们就可以设置一个变量hungery来记录连续有多少个学生不喜欢堆栈的三明治。
1、当有一个学生不喜欢栈顶的三明治时,就让hungery自加1。
2、当有一个学生喜欢栈顶的三明治时,就让hungery归零,因为已经不连续了。

2、代码实现

2.1、先将队列实现一

因为我选用的是C语言(唉,其实是我现在只学到了C语言),所以没办法,还得自己先造轮子。我们先得把队列实现一下:

// 重定义数据类型
typedef int QDataType;
// 定义节点类型
typedef struct QueueNode {
	struct QueueNode* next;
	QDataType data;
} QueueNode;
// 定义队列类型
typedef struct Queue {
	QueueNode* head;
	QueueNode* tail;
} Queue;
// 队列的初始化
void QueueInit(Queue* pq);
// 队列的入队
void QueuePush(Queue* pq, QDataType x);
// 队列的出队
void QueuePop(Queue* pq);
// 返回队列的对头元素
QDataType QueueFront(Queue* pq);
// 返回队列的队尾元素
QDataType QueueBack(Queue* pq);
// 返回队列中的节点个数
int QueueSize(Queue* pq);
// 判断队列是否为空
bool QueueEmpty(Queue* pq);
// 销毁队列
void QueueDestroy(Queue* pq);
// 队列的初始化
void QueueInit(Queue* pq) {
	assert(pq);
	pq->head = NULL;
	pq->tail = NULL;
}
// 队列的入队
void QueuePush(Queue* pq, QDataType x) {
	assert(pq);
	// 创建一个新节点
	QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
	if (NULL == newNode) {
		perror("malloc fail!\n");
		exit(-1);
	}
	newNode->data = x;
	if (NULL == pq->head) {
		pq->head = newNode;
		pq->tail = newNode;
		pq->tail->next = NULL;
	}
	else {
		pq->tail->next = newNode;
		pq->tail = pq->tail->next;
		pq->tail->next = NULL;
	}
}
// 队列的出队
void QueuePop(Queue* pq) {
	assert(pq);
	assert(!QueueEmpty(pq));
	QueueNode* next = pq->head->next;
	free(pq->head);
	pq->head = next;
	// 如果对头为空了,我们也要把队尾也给置空,避免野指针
	if (NULL == pq->head) {
		pq->tail = NULL;
	}
}
// 返回队列的对头元素
QDataType QueueFront(Queue* pq) {
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->head->data;
}
// 返回队列的队尾元素
QDataType QueueBack(Queue* pq) {
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->tail->data;
}
// 返回队列中的节点个数
int QueueSize(Queue* pq) {
	assert(pq);
	QueueNode* cur = pq->head;
	int size = 0;
	while (cur) {
		size++;
		cur = cur->next;
	}
	return size;
}
// 判断队列是否为空
bool QueueEmpty(Queue* pq) {
	assert(pq);
	return pq->head == NULL;
}
// 销毁队列
void QueueDestroy(Queue* pq) {
	assert(pq);
	if (!QueueEmpty(pq)) {
        QueueNode* cur = pq->head;
        QueueNode* next = cur->next;
        while (cur) {
            next = cur->next;
            free(cur);
            cur = next;
        }
    }
	
	pq->head = NULL;
	pq->tail = NULL;
}

2.2、代码实现

有了以上思路和队列的实现,那我们写起代码来也就水到渠成了:

int countStudents(int* students, int studentsSize, int* sandwiches, int sandwichesSize) {
    assert(students && sandwiches);
    Queue queue;
    QueueInit(&queue);
    int i = 0;
    // 先将学生全都入队
    for (i = 0; i < studentsSize; i++) {
        QueuePush(&queue, students[i]);
    }
    int hungery = 0; // 统计连续有多少个学生吃不到三明治
    i = 0;
    // 三明治不需要用栈存,直接遍历控制即可
    while (i < sandwichesSize) {
        if (sandwiches[i] == QueueFront(&queue)) {
            QueuePop(&queue);
            i++;
            hungery = 0;
        } else {
            QueuePush(&queue, QueueFront(&queue));
            QueuePop(&queue);
            hungery++;
        }
        if (hungery == QueueSize(&queue) || QueueEmpty(&queue)) {
            break;
        }
    }
    QueueDestroy(&queue);
    return hungery; 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/576016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进程信号之产生

目录 &#x1f3c6;一、认识信号 &#x1f3c6;二、信号的产生 ①通过终端按键产生信号 ②调用系统函数向进程发信号 ③由硬件异常产生信号 ④软件条件产生信号 &#x1f3c6;三、进程退出时的核心转储的问题 &#x1f3c6;一、认识信号 生活中&#xff0c;有很多信号…

Python 下载的 11 种姿势,一种比一种高级

今天我们一起学习如何使用不同的Python模块从web下载文件。此外&#xff0c;你将下载常规文件、web页面、Amazon S3和其他资源。 通过本文的学习&#xff0c;你将学到如何克服可能遇到的各种挑战&#xff0c;例如下载重定向的文件、下载大型文件、完成一个多线程下载以及其他策…

面试官:你会从哪些维度进行MySQL性能优化?

面试官如果问你&#xff1a;你会从哪些维度进行MySQL性能优化&#xff1f;你会怎么回答&#xff1f; 所谓的性能优化&#xff0c;一般针对的是MySQL查询的优化。既然是优化查询&#xff0c;我们自然要先知道查询操作要经过哪些环节&#xff0c;然后思考可以在哪些环节进行优化…

English Learning - L3 作业打卡 Lesson3 Day21 2023.5.25 周四

English Learning - L3 作业打卡 Lesson3 Day21 2023.5.25 周四 引言&#x1f349;句1: Here is another expression about meat one man’s meat is another man’s poison.成分划分连读爆破语调 &#x1f349;句2: In other words, one person might like something very muc…

postMessage引发XSS

这次的主题是postMessage未验证消息来源origin&#xff0c;导致恶意代码注入的dom-xss&#xff0c;由于很少人关注这类型的注入&#xff0c;因为挖掘难度中等&#xff0c;需要一定的javascript代码审计能力&#xff0c;且漏洞危害等级不高&#xff0c;导致国内许多SRC都存在跨域…

【计算机网络】 7、websocket 概念、sdk、实现

文章目录 一、背景二、简介三、client3.1 ws 构造函数3.2 ws.readyState3.3 ws.onopen3.4 ws.onclose3.5 ws.onmessage3.6 ws.send3.7 ws.bufferedAmount3.8 ws.onerror 四、server4.1 go4.1.1 apifox client4.1.2 js client 五、范式 一、背景 已经有了 http 协议&#xff0c…

懂点自动化基础就要25k? 测试总监:给你15K,爱来不来

公司前段缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在10-25k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。看简历很多都是3年工作经验&#xff0c;但面试…

【C++11】C++的新特性(详解)

文章目录 1.C11简介2.统一的列表初始化2.1{}初始化2.2 std::initializer_list 3.声明3.1 auto3.2 decltype3.3 nullptr 4.范围for5.STL中一些变化5.1 array5.2 forward_list容器5.3 unordered_map和unordered_set容器 1.C11简介 相比于C98/03&#xff0c;C11则带来了数量可观的…

2023年武汉市职业院校技能大赛“网络安全”竞赛任务书

2023年武汉市职业院校技能大赛“网络安全” 竞赛任务书 一、竞赛时间 总计&#xff1a;360分钟 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略配置 A-3 流量完整性保护 A-4 事件监控 A-5 服…

2023年电工杯B题半成品论文使用讲解

注&#xff1a;蓝色字体为说明备注解释字体&#xff0c;不能出现在大家的论文里。黑色字体为论文部分&#xff0c;大家可以根据红色字体的注记进行摘抄。该文件为半成品论文&#xff0c;即引导大家每一步做什么&#xff0c;怎么做&#xff0c;展示按着本团队的解题思路进行建模…

Integrated LogicAnalyzer v6.2 (Vivado ILA使用方法)

Chapter 1 Overview 1.1 Feature Summary&#xff08;功能摘要&#xff09; FPGA设计中的信号连接到ILA核时钟和探针输入&#xff08;图1-1&#xff09;。这些连接到探针输入的信号以设计速度进行采样&#xff0c;并使用片上块RAM&#xff08;BRAM&#xff09;进行存储…

【旅游网】前后端分离——用户管理

1、先创建数据库&#xff0c;建立用户表 2、创建后端项目&#xff0c;这里使用Springboot&#xff0c;创建好controler、mapping、pojo、service四个文件&#xff0c;在实体里创建User类 package com.example.pjtest.Pojo;public class User {public int id_u;public Strin…

SpringBoot 之 Tomcat 与 Undertow 容器性能对比

一、前言&#x1f525; 环境说明&#xff1a;Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE 在上一篇《SpringBoot 之配置 Undertow 容器》一文中写道&#xff1a;“Undertow 的性能和内存使用方面都要优于 Tomcat 容器”, 这一期&#xff0c;我就要给大家来求证…

受不了了,被00后卷的想辞职了

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&…

御剑WEB指纹识别系统教程,图文教程(超详细)

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 御剑WEB指纹识别 一、基本使用二、内置字典三、自定义字典四、扫描原理 御剑WEB指纹识别系…

php html转pdf wkhtmltopdf

系统CentOS7.6 1.安装 wkhtmltopdf yum install wkhtmltopdf 看别的大佬的教程这步就已经可以正常生成&#xff0c;但我这边运行脚本的时候返回了 "wkhtmltopdf: cannot connect to X server" 2.安装 Xvfb yum install Xvfb 3.运行脚本 xvfb-run --server-ar…

20220912深圳市梧桐山桃花源看植物

20220912深圳市梧桐山桃花源看植物 2023/5/27 13:27 大自然生态探索之旅第3期 明天去梧桐山看植物。有空不&#xff1f; 交通方式&#xff1a; 黄贝岭地铁站C出口坐M445到终点&#xff01; 02木荷 https://baijiahao.baidu.com/s?id1676100940201729045&wfrspider&fo…

人生苦短,我用Python。

人生苦短&#xff0c;我用Python。欢迎大家一起分享&#xff0c;你是如何入门Python的~ 方向一&#xff1a;你是如何学习/自学 Python 的&#xff1f; 偶然的机会接触到python&#xff0c;于是开始利用空闲时间学起了python。自学过2年python&#xff0c;有一些学习心得和避坑…

分布式事务的21种武器 - 6

在分布式系统中&#xff0c;事务的处理分布在不同组件、服务中&#xff0c;因此分布式事务的ACID保障面临着一些特殊难点。本系列文章介绍了21种分布式事务设计模式&#xff0c;并分析其实现原理和优缺点&#xff0c;在面对具体分布式事务问题时&#xff0c;可以选择合适的模式…

Linux——进程轮换

目录 一.进程切换 1.定义&#xff1a; 2.硬件上下文&#xff1a; 总结&#xff1a; 一.进程切换 1.定义&#xff1a; 进程切换(process switch),作为抢占式多任务的一个重要功能&#xff0c;其实质就是OS内核挂起正在运行的进程A,然后将先前被挂起的另一个进程B恢复运行。 2.硬…