一道使用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();
    }

相关推荐

  1. 一道使用LinkedListStack解决算法

    2024-01-19 17:36:02       46 阅读
  2. stack queue Leetcode 栈队列算法

    2024-01-19 17:36:02       33 阅读
  3. ArrayListLinkedList区别

    2024-01-19 17:36:02       54 阅读
  4. ArrayList LinkedList 区别

    2024-01-19 17:36:02       38 阅读
  5. ArrayLIstlinkedlist区别

    2024-01-19 17:36:02       50 阅读
  6. ArrayListLinkedList区别

    2024-01-19 17:36:02       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-19 17:36:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-19 17:36:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-19 17:36:02       87 阅读
  4. Python语言-面向对象

    2024-01-19 17:36:02       96 阅读

热门阅读

  1. 6、机器学习之随机森林

    2024-01-19 17:36:02       59 阅读
  2. 1818:红与黑【解析】-------深度优先搜索

    2024-01-19 17:36:02       43 阅读
  3. springboot项目引入onlyoffice多人协同编辑文档

    2024-01-19 17:36:02       63 阅读
  4. 五个常见的 jQuery 面试题

    2024-01-19 17:36:02       46 阅读
  5. SVN 常用命令

    2024-01-19 17:36:02       51 阅读
  6. 【Bug】.net6 cap总线+rabbitmq延时消息收不到

    2024-01-19 17:36:02       64 阅读
  7. 力扣(leetcode)第821题字符的最短距离(Python)

    2024-01-19 17:36:02       57 阅读