周赛笔记189


一、在既定时间做作业的学生人数

给你两个整数数组 startTime(开始时间)和 endTime(结束时间),并指定一个整数 queryTime 作为查询时间。
已知,第 i 名学生在 startTime[i] 时开始写作业并于 endTime[i] 时完成作业。
请返回在查询时间 queryTime 时正在做作业的学生人数。形式上,返回能够使 queryTime 处于区间 [startTime[i], endTime[i]](含)的学生人数。

class Solution:
    def busyStudent(self, startTime: List[int], endTime: List[int], queryTime: int) -> int:
        return sum(startTime[i] <= queryTime <= endTime[i] for i in range(len(startTime)))

二、重新排列句子中的单词

「句子」是一个用空格分隔单词的字符串。给你一个满足下述格式的句子 text :

  • 句子的首字母大写
  • text 中的每个单词都用单个空格分隔。

请你重新排列 text 中的单词,使所有单词按其长度的升序排列。如果两个单词的长度相同,则保留其在原句子中的相对顺序。

class Solution:
    def arrangeWords(self, text: str) -> str:
        li=text.split(' ')
        li[0]=li[0].lower()
        li.sort(key=len)
        return ' '.join(li).capitalize()

小结

  1. str.capitalize()
  2. .sort(key=len)

三、收藏清单

给你一个数组 favoriteCompanies ,其中 favoriteCompanies[i] 是第 i 名用户收藏的公司清单(下标从 0 开始)。
请找出不是其他任何人收藏的公司清单的子集的收藏清单,并返回该清单下标。下标需要按升序排列。

class Solution:
    def peopleIndexes(self, favoriteCompanies: List[List[str]]) -> List[int]:
        ans=[_ for _ in range(len(favoriteCompanies))]
        for i in range(len(favoriteCompanies)-1):
            for j in range(i+1,len(favoriteCompanies)):
                a,b=set(favoriteCompanies[i]),set(favoriteCompanies[j])
                if a==b and i in ans:
                    ans.remove(i)
                elif a.issubset(b) and i in ans: 
                    ans.remove(i)
                elif b.issubset(a) and j in ans: 
                    ans.remove(j)
        return ans

小结

  1. a.issubset(b),判断a是否是b子集
  2. .remove(i),若i不存在会报错

四、圆形靶内的最大飞镖数量

墙壁上挂着一个圆形的飞镖靶。现在请你蒙着眼睛向靶上投掷飞镖。
投掷到墙上的飞镖用二维平面上的点坐标数组表示。飞镖靶的半径为 r
请返回能够落在 任意 半径为 r 的圆形靶内或靶上的最大飞镖数。

class Solution:
    def numPoints(self, points: List[List[int]], r: int) -> int:
        func=lambda o:sum(dist(p,o)<=r for p in points) #检查包含
        ans=1
        for p1 in points:
            for p2 in points:                           #枚举
                if 0<dist(p1,p2)<=2*r:                  #走数学流程
                    mid = [(p1[0]+p2[0])/2,(p1[1]+p2[1])/2]
                    d = [(p1[0]-p2[0])/2,(p1[1]-p2[1])/2]
                    k = sqrt(r**2-d[0]**2-d[1]**2)/hypot(*d)
                    o = [mid[0]+d[1]*k,mid[1]-d[0]*k]   #圆心
                    ans=max(ans, func(o))
        return ans

主要思路:枚举

  1. 枚举points中每两个点,确定圆心。
  2. 更新最大值,输出

小结:
第四题的枚举+math模块+数学,666。
每天都要好好学习


文章作者: ╯晓~
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ╯晓~ !
评论
  目录