1700. 无法吃午餐的学生数量(双指针+计数)

204 阅读1分钟

image.jpeg

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

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目提示

    • 1 <= students.length, sandwiches.length <= 100
    • students.length == sandwiches.length
    • sandwiches[i] 要么是 0 ,要么是 1 。
    • students[i] 要么是 0 ,要么是 1 。

二、思路分析:

我们今天拿到本题是 leetcode 难度为简单题 1700. 无法吃午餐的学生数量。题目要求students数组和sandwiches数组中找到无法吃午餐的学生数量。对题目细节有如下几点:

  • students和sandwiches数组的元素只有0和1两种类型
  • 0 代表圆形,1代表方形
  • students数组的元素可以移到到任意位置(循环队列),sandwiches元素不能移到,当students元素与sandwiches元素一致时,则推出sandwiches[0]推出

根据题目内容,可以使用双指针或者计数方法来解答本题,思路如下:

  • 方法一:双指针

    • 根据题目我们可以分别定义i,j两个指针,i指向students[0],j指向sandwiches[0]
    • 初始化ans学生都不能拿到喜欢的三明治,len(students),cnt变量记录当前不喜欢吃的学生数
    • 当student[i]与sandwiches[j]相等时,则无法吃三明治学生ans减一,并且student[i]位置赋值为-1代表该位置无学生,当前不喜欢的三明治cnt归零,j指针在sandwiches右移一步,否则当前不喜欢的cnt加1
    • i 指针向右移动一步,i与len(students)取模赋值(循环队列)
    class Solution(object):
        def countStudents(self, students, sandwiches):
            """
            :type students: List[int]
            :type sandwiches: List[int]
            :rtype: int
            """
            i,j,cnt = 0,0,0
            ans = len(students)
    
            while cnt < ans:
                if students[i] != -1:
                    if students[i] == sandwiches[j]:
                        ans -=1
                        cnt = 0
                        students[i] = -1
                        j +=1
                    else:
                        cnt +=1
                i +=1
                i %= len(students)
            return ans
    
  • 方法二:计数

    • students数组元素可以移动位置,所以我们可以对喜欢⭕️和方形的三明治人数统计出来
    • 遍历三明治,当遍历到的三明治是圆形的,则在喜欢圆形的学生人数减一
    • 当遍历到的三明治是方形时,则在喜欢方形的学生人数减一
    • 当喜欢圆形或者方形的学生人数不大于0时,则退出遍历,返回剩余喜欢方形和圆形的学生人数和
    class Solution(object):
        def countStudents(self, students, sandwiches):
            """
            :type students: List[int]
            :type sandwiches: List[int]
            :rtype: int
            """
            studentnum = Counter(students)
            for sandwich in sandwiches:
                if studentnum[sandwich] > 0:
                    studentnum[sandwich] -=1
                else:
                    break
            return studentnum[0]+studentnum[1]
    
    

三、总结:

本题是一道关于栈和队列循环应用,题目中可以从三明治数组只能从栈顶来判断,学生喜爱的三明治,当栈顶的三明治在学生中都不喜欢时,则可以退出循环遍历返回剩余学生人数,计数方法AC记录如下:

image.png

  • 时间复杂度:O(n),遍历sandwiches的长度
  • 空间复杂度:O(C),需要统计students数组0和1的次数

以上是本期内容,欢迎大佬们点赞评论,下期见~~~