力扣第287场周赛(前三题)Python题解

🔔转化时间需要的最少操作数🔔

1 题目

 

 2 代码

 

class Solution:
    def convertTime(self, current: str, correct: str):
        h1,m1=current.split(':')
        h2,m2=correct.split(':')
        time=(int(h2)*60+int(m2))-(int(h1)*60+int(m1))
        cnt=0
        for i in [60,15,5,1]:
            tmp,time=divmod(time,i)
            cnt+=tmp
        return(cnt)

🔔找出输掉零场或一场比赛的玩家🔔

1 题目

 

 2 分析和讲解

题目要求输出只有胜利的和只输一场的,总共的情况包括没有输的 winner,只输一场的 loser,和输的场次大于1的 losermore,显然只要在 matcher[i][1]中,就不可能没有输过,所以首先将输的人摘出来

loser=Counter([i[1] for i in matches])

再将没有输的人摘出来,保证其不在 loser 中

winner=Counter([i[0] for i in matches if i[0] not in loser])

这样的话,winner 中只包含没有输的人,排个序即可,而在 loser 中我们需要找到只输一次的人,即

loser[i]==1]
class Solution:
    def findWinners(self, matches: List[List[int]]):
        from collections import Counter
        loser=Counter([i[1] for i in matches])
        winner=Counter([i[0] for i in matches if i[0] not in loser])
        return([sorted(winner),sorted([i for i in loser if loser[i]==1])])

 3 猝不及防的知识点

关于代码中的 Counter

Counter 是实现的 dict 的一个子类,可以用来方便地计数

#(1) 使用
>>> from collections import Counter

>>> c = Counter('abcasd')
>>> c
Counter({'a': 2, 'c': 1, 'b': 1, 's': 1, 'd': 1})

取出某个字符的次数时同字典使用方法

>>> c = Counter(['apple', 'pear'])
>>> c['orange']
0

常见用法

# most_common(n) 按照counter的计数,按照降序,返回前n项组成的list; n忽略时返回全部
>>> Counter('abracadabra').most_common(3)
[('a', 5), ('r', 2), ('b', 2)]

# subtract([iterable-or-mapping]) counter按照相应的元素,计数相减
>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> d = Counter(a=1, b=2, c=3, d=4)
>>> c.subtract(d)
>>> c
Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})

# Counter 间的数学集合操作
>>> c = Counter(a=3, b=1, c=5)
>>> d = Counter(a=1, b=2, d=4)
>>> c + d                       # counter相加, 相同的key的value相加
Counter({'c': 5, 'a': 4, 'd': 4, 'b': 3})
>>> c - d                       # counter相减, 相同的key的value相减,只保留正值得value
Counter({'c': 5, 'a': 2})
>>> c & d                       # 交集:  取两者都有的key,value取小的那一个
Counter({'a': 1, 'b': 1})
>>> c | d                       # 并集:  汇聚所有的key, key相同的情况下,取大的value
Counter({'c': 5, 'd': 4, 'a': 3, 'b': 2})

#常见做法:
sum(c.values())                 # 继承自字典的.values()方法返回values的列表,再求和
sum(c)                          # 求和c的keys,也可写作sum(c.keys())
sorted(c)                       # 对c的keys进行排序,也可写作sorted(c.keys()),输出为列表
c.clear()                       # 继承自字典的.clear()方法,清空counter
list(c)                         # 返回key组成的list
set(c)                          # 返回key组成的set
dict(c)                         # 转化成字典
c.items()                       # 转化成(元素,计数值)组成的列表
c.most_common()[:-n-1:-1]       # 最小n个计数的(元素,计数值)组成的列表
c += Counter()                  # 利用counter的相加来去除负值和0的值

🔔每个小孩最多能分到多少糖果🔔

1 题目

 

2 代码

二分答案:题目问的是是否存在某个糖果数目满足 k 个小孩的需求,并求这个糖果数目的最大值,我们知道糖果数目最小值为0,即糖果总数小于 k,最大值为 max(candies),就是最大的那一堆糖果数目,因为题目要求一个孩子至多拿走一堆糖果,

步骤:设置判断函数,判断在得知每个孩子要被分得 x 个糖果时,这些糖果是否能被分出 k 个 x,即求原来的每一堆糖果能凑出几个 x,求出总共凑出的 x 的数目 cnt 与要求的数目比较即可

class Solution:
    def maximumCandies(self, candies: List[int], k: int):
        def check(x):
            cnt=0
            for i in candies:
                cnt+=i//x
            if cnt<k:
                return False
            return True
        
        l,r=0,max(candies)
        while l!=r:
            mid=(l+r+1)//2
            if check(mid):
                l=mid
            else:
                r=mid-1
        return r

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值