一、在既定时间做作业的学生人数
给你两个整数数组 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()
小结
str.capitalize()
.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
小结
a.issubset(b)
,判断a是否是b子集.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
主要思路:枚举
- 枚举points中每两个点,确定圆心。
- 更新最大值,输出
小结:
第四题的枚举
+math模块
+数学
,666。
每天都要好好学习