持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目提示
- 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记录如下:
- 时间复杂度:O(n),遍历sandwiches的长度
- 空间复杂度:O(C),需要统计students数组0和1的次数
以上是本期内容,欢迎大佬们点赞评论,下期见~~~