【LeetCode每日一题】【模拟题】2022-10-19 1700. 无法吃午餐的学生数量 Java实现

文章目录

  • 题目链接
  • 题目
  • 我的思路
  • 官方思路


题目链接

https://leetcode.cn/problems/number-of-students-unable-to-eat-lunch/

题目

【LeetCode每日一题】【模拟题】2022-10-19 1700. 无法吃午餐的学生数量 Java实现_第1张图片

我的思路

【LeetCode每日一题】【模拟题】2022-10-19 1700. 无法吃午餐的学生数量 Java实现_第2张图片
把所有学生的数据用LinkedList存储,实现从队头删除,在队尾加入的操作

用for循环遍历sandwiches数组,如果当前sandwiches[i]和LinkedList的头节点元素的值相同,则i++,LinkedList删除头节点;如果当前sandwiches[i]和LinkedList的头节点元素的值不相同,则将头节点的数值添加到队尾,然后删除头节点

如果LinkedList中所有的学生都进行过从队头删除、队尾插入的操作,那么这些学生就是无法吃午餐的学生,返回当前LinkedList的大小即可

import java.util.LinkedList;

class Solution {
    public int countStudents(int[] students, int[] sandwiches) {

        LinkedList<Integer> stuList = new LinkedList<>();
        for (int student : students) {
            stuList.addLast(student);
        }
        int cnt = 0;
        for (int i = 0; i < sandwiches.length; i++) {
            if (stuList.getFirst() != sandwiches[i]) {
                cnt = 0;
                while (stuList.getFirst() != sandwiches[i]) {
                    stuList.addLast(stuList.removeFirst());
                    cnt++;
                    if (cnt == stuList.size()) {
                        return cnt;
                    }
                }
            }
            stuList.removeFirst();
        }
        return 0;
    }
}

官方思路

假设喜欢吃圆形三明治的学生数量为 s 0 s_0 s0,喜欢吃方型三明治的学生数量为 s 1 s_1 s1,根据题意,我们可以知道栈顶的三明治能否被拿走取决于队列剩余的学生中是否有学生喜欢,因此,学生在队列中的相对位置不影响整个过程,我们只需要记录队列剩余的学生中 s 0 s_0 s0 s 1 s_1 s1的值。

我们对整个过程进行模拟,如果栈顶的元素为0,并且 s 0 > 0 s_0>0 s0>0,那么 s 0 s_0 s0减一;如果栈顶元素为1,并且 s 1 > 0 s_1>0 s1>0,那么 s 1 s_1 s1减1;否则,终止过程,返回 s 0 + s 1 s_0+s_1 s0+s1

import java.util.Arrays;

class Solution {
    public int countStudents(int[] students, int[] sandwiches) {
        int s0 = 0, s1 = 0;
        s1 = Arrays.stream(students).sum();
        s0 = students.length - s1;
        for (int sandwich : sandwiches) {
            if (sandwich == 0 && s0 > 0) {
                s0--;
            } else if (sandwich == 1 && s1 > 0) {
                s1--;
            } else {
                break;
            }
        }
        return s0 + s1;
    }
}

你可能感兴趣的:(LeetCode,leetcode,java,算法,学习)