算法小知识-----10.19----- 无法吃午餐的学生数量

38 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

周三了,距离周五还有两天,今天的天气也是阴阴凉凉

无法吃午餐的学生数量

该题出自力扣的1700题 —— 无法吃午餐的学生数量【简单题】

审题

image.png

  • 这道题虽然是简单题,但是还是不简单的,毕竟题目很长
  • 题意就是给出两个数组,分别代表学生和三文治的值,业务规则是每个学生有对应喜欢的三文治,如果喜欢的就直接消耗掉,如果不喜欢则回到队末。三文治的值由1和0组成,三文治的值不可轮转,但是学生可以轮转。最终返回无法吃到午餐的学生数量
  • 其实就是数一下第二天有多少家长来闹事大概就能推算出有多少学生没吃饭了
  • 按照题意的话,那么就可以直接模拟解法,开辟一个栈的空间去管理学生,循环三文治的数组,在内部不断while循环学生,直到可以找出为止
  • 另一种解法就是利用三文治的业务规则,三文治内部只有1和0,那么对应的学生也是。因此直接统计出学生1的个数和0的个数,对于学生数组来说,1和0存在于哪个位置并不重要,三文治的栈顶才重要,因此直接相减个数,直到有一种无法减,则最终两数相加即可

编码

    public int countStudents(int[] students, int[] sandwiches) {
    int len = students.length;
    Deque<Integer> stack = new ArrayDeque<>();
    for (int student : students) {
        stack.addLast(student);
    }
    for (int i = 0; i < len; i++) {
        int sandwich = sandwiches[i];
        int size = stack.size();
        int s = 0;
        Integer pop = stack.pollFirst();
        while (sandwich != pop){
            if (s == size)return s;
            stack.addLast(pop);
            pop = stack.pollFirst();
            s++;
        }
    }
    return 0;
}

image.png

   public int countStudents(int[] students, int[] sandwiches) {
int[] counts = new int[2];
        for (int num : students) {
            counts[num] += 1;
        }
        int n = sandwiches.length;
        for (int i = 0; i < n; i++) {
            if (counts[sandwiches[i]] > 0) {
                counts[sandwiches[i]] -= 1;
            } else {
                return n - i;
            }
        }
        return 0;

    }

image.png