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

一道使用LinkedList和Stack解决的算法题

一、无法吃午餐的学生数量

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

二、代码

public static int countStudents(int[] students, int[] sandwiches) {// 由于学生可以从队列头部删除和添加到队尾,则用LinkedList存储合适// 三明治依次从栈顶取出,则用Stack存储合适Deque<Integer> dequeList = new LinkedList<>();Stack<Integer> stack = new Stack<>();for (int i = 0; i < students.length; i++) {dequeList.add(students[i]);// 由于三明治存储在栈中,则将原始sandwiches数组倒序存入,这样取出时候才是原始sandwiches顺序stack.push(sandwiches[sandwiches.length - i - 1]);}while (!dequeList.isEmpty() && !stack.isEmpty() && dequeList.contains(stack.peek())) {if (!dequeList.peekFirst().equals(stack.peek())) {// 移除队列头部元素,将其添加至尾部Integer tempFirst = dequeList.poll();dequeList.offer(tempFirst);} else {// 移除队列头部元素,移除栈顶元素dequeList.removeFirst();stack.pop();}}return dequeList.size();}
http://www.lryc.cn/news/281513.html

相关文章:

  • 通用外设-W25Q64
  • Spring MVC MVC介绍和入门案例
  • android使用ndk开发
  • 行为型设计模式——模板方法模式
  • 曲面上偏移命令的查找
  • 世邦spon IP网络对讲广播系统任意文件上传漏洞
  • mp4文件全部转换为mp3
  • 深信服技术认证“SCSA-S”划重点:逻辑漏洞
  • Linux grep命令教程:强大的文本搜索工具(附案例详解和注意事项)
  • 网络安全的威胁PPT
  • CUDA驱动深度学习发展 - 技术全解与实战
  • 如何做用户分层和标签体系
  • Vue+Element Ui实现el-table自定义表头下拉选择表头筛选
  • 使用Java连接MongoDB (6.0.12) 报错
  • 数学建模day16-预测模型
  • Vue3响应式系统(一)
  • MStart | MStart开发与学习
  • GoZero微服务个人探索之路(一)Etcd:context deadline exceeded原因探究及解决
  • C语言从入门到实战——结构体与位段
  • java如何修改windows计算机本地日期和时间?
  • flink中的row类型详解
  • 漏洞复现-Yearning front 任意文件读取漏洞(附漏洞检测脚本)
  • K8S中SC、PV、PVC的理解
  • Agisoft Metashape 基于影像的外部点云着色
  • 图解结算平台:准确高效给商户结款
  • 修改和调试 onnx 模型
  • 不同整数的最少数目和单词直接最短距离
  • 【Microsoft Edge】版本 109.0.1518.55 (正式版本) (64 位) 更新失败解决方案
  • 深度学习笔记(四)——使用TF2构建基础网络的常用函数+简单ML分类实现
  • 大模型学习篇(一):初识大模型