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

这篇具有很好参考价值的文章主要介绍了一道使用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 = []。
所以所有学生都有三明治吃。文章来源地址https://www.toymoban.com/news/detail-799780.html

二、代码

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();
    }

到了这里,关于一道使用LinkedList和Stack解决的算法题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 每日一道面试题之ArrayList 和 LinkedList 的区别是什么?

    ArrayList 和 LinkedList 是Java中常用的两种集合类,它们在实现和使用上有一些区别,如下所示: 内部实现 : ArrayList 是 基于数组实现 的动态数组,而 LinkedList 是 基于双向链表 实现的。 插入和删除操作 : ArrayList 在插入和删除元素时,需要移动其他元素来保持其数组元素位置

    2024年02月16日
    浏览(45)
  • 【数据结构】 LinkedList的模拟实现与使用

    LinkedList 的官方文档 LinkedList的底层是双向链表结构(链表后面介绍),由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。 我们在这里创建一个 MyLinke

    2024年02月11日
    浏览(46)
  • 【数据结构与算法】6、栈(Stack)的实现、LeetCode:有效的括号

    🌱 栈 是一种特殊的线性表, 只能在一端进行操作 🌱 往栈中 添加 元素的操作,一般叫做 push ( 入栈 ) 🌱 从栈中 移除 元素的操作,一般叫做 pop ,出栈(只能移除栈顶元素),也叫做: 弹出栈顶元素 🌱 后进先出 的原则, L ast I n F irst O ut, LIFO 注意:这里的 栈 与内

    2024年02月13日
    浏览(39)
  • [java数据结构] ArrayList和LinkedList介绍与使用

    (一) 线性表 (二) ArrayList 1. ArrayList的介绍 2. ArrayList的常见方法和使用 3. ArrayList的遍历 4. ArrayList的模拟实现 5. ArrayList的优缺点 (三) LinkedList 1. LinkedList的介绍 2. LinkedList的常见方法和使用 3. LinkedList的遍历 4. LinkedList的模拟实现 5. LinkedList的优缺点 (四) ArrayList和LinkedList的区别

    2024年01月21日
    浏览(46)
  • Java中栈实现怎么选?Stack、Deque、ArrayDeque、LinkedList(含常用Api积累)

    目录 Java中的Stack类 不用Stack有以下两点原因 1、从性能上来说应该使用Deque代替Stack。 2、Stack从Vector继承是个历史遗留问题,JDK官方已建议优先使用Deque的实现类来代替Stack。 该用ArrayDeque还是LinkedList? ArrayDeque与LinkList区别: ArrayDeque: LinkList: 结论 API积累 Deque中常用方法:

    2024年02月07日
    浏览(39)
  • 数据结构和算法的部分例题(力扣)

    1.1 合并一个数组的两个有序区间 2.1 反转单向链表 (方法1)构建一个新的链表,从就链表依次拿到每个节点,创建新的节点添加至新链表头部,完成后的新链表就是倒序的,简单,但是需要创建新的对象 (方法2)与方法1类似,构建新的链表,从头部移除节点,添加至新链

    2024年01月18日
    浏览(56)
  • 【数据结构与算法】力扣:对称二叉树

    给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root = [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root = [1,2,2,null,3,null,3] 输出:false 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/symmetric-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请

    2024年02月13日
    浏览(38)
  • 【数据结构与算法】力扣:二叉树的层序遍历

    给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例1: 输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2: 输入:root = [1] 输出:[[1]] 示例 3: 输入:root = [] 输出:[] 来源:力扣(LeetCode) 链接:https://leetcode.cn/p

    2024年02月13日
    浏览(47)
  • 力扣每日一道系列 --- LeetCode 160. 相交链表

    📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构探索 ✅LeetCode每日一道 🌅 有航道的人,再渺小也不会迷途。 LeetCode 160. 相交链表 思路: 首先计算两个链表的长度,然后判断两个链表的尾节点是否相同。如果不同,那么这两个链表就没有交集,返回空;如果相同,那么就

    2024年02月05日
    浏览(35)
  • 力扣每日一道系列 --- LeetCode 206. 反转链表

    📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构探索 ✅LeetCode每日一道 🌅 有航道的人,再渺小也不会迷途。 LeetCode 206. 反转链表 初始化两个指针, cur 和 newhead 。 cur 指向给定的链表头节点, newhead 初始为 NULL 。 在 cur 不为空的情况下,执行循环。 首先,记录下 cur 的下

    2024年02月04日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包