Leetcode每日刷题【中】--Day 17 (含周赛前两题)

本文介绍了力扣第242场周赛的前两道题目,涉及字符串中连续子字符串的比较和列车最小时速计算。第一题通过分析字符串中的'0'和'1'出现情况确定最长子串;第二题利用二分查找求解列车在有限时间内能到达目的地的最小时速。代码实现包括关键逻辑和边界条件处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

力扣第242场周赛,前两题。

为啥是前两题?

因为菜hhhh~

5763. 哪种连续子字符串更长

简单地数 数

代码丑,简单题能快点过就好了。虽然卡了一会儿

class Solution:
    def checkZeroOnes(self, s: str) -> bool:
        atotal, btotal = [], []
        a, b = 0, 0
        last = s[0]
        length = len(s)
        flag = s[0]
        for i in s:
            if i == '1':
                if flag == i:
                    a += 1
                else:
                    flag = i
                    a += 1
                    btotal.append(b)
                    b = 0
            elif i == '0':
                if flag == i:
                    b += 1
                else:
                    flag = i
                    b += 1
                    atotal.append(a)
                    a = 0
        btotal.append(b)
        atotal.append(a)  # 怕最后漏了一个
        return max(atotal) > max(btotal)
5764. 准时到达的列车最小时速

这题车速度是连续有序的值,可以进行二分查找
需要在等待车的位置进行取整处理,其他细节代码有注释

class Solution:
    def minSpeedOnTime(self, dist, hour):
        if len(dist)-1 >= hour:  # 最快一班车也要1小时,如果需要等待的车都比给的时间多,肯定不能,返回-1
            return -1
        low = 1  # 下限应该就是1啦,不然怎么走
        # 这里速度上限的思路是:( 距离最大化 / 时间最小化(假设花了很多时间等待))
        high = len(dist)*max(dist)//(hour-len(dist)+1) 
        
        # 接下来就是熟悉的二分查找了
        while low < high:
            mid = (low+high) // 2  
            if self.check(hour, mid, dist):  # 这个条件是时间不够返回true
                low = mid + 1
            else:
                high = mid
        # 加上一个判断bool的返回        
        return int(low)
    
    def check(self, hour, mid, dist):
        total = 0
        lenth = len(dist)
        for i in range(lenth):
            if i == lenth-1:
                total += dist[i]/mid  # 最后面的车坐完就结束了
            else:
                total += ceil(dist[i]/mid)  # 前面几班车都需要向上取整,因为都需要等待
        return total > hour  # 返回时间不够(true)
1707. 与数组中元素的最大异或值 【该题非正确解答,等有时间再更新】

确认过眼神,我做不出来的题目,字典树。还得仔细了解了解才行。

不过还是得先来写一下自己幼稚的思路(超时做法)。

class Solution:
    def maximizeXor(self, nums: List[int], queries: List[List[int]]) -> List[int]:
        nums = set(nums)  # 能够去重自动排序
        nums = list(nums)  # 分开写是因为,一旦没有重复的元素,list(set(nums))是不会进行排序的
        min_num = nums[0]  # 记录最小值
        length = len(queries)  # 准备遍历
        ans = []
        for i in range(length):
            ans.append(self.check(i, nums, queries, min_num))  # 这里是将最大的异或值返回

        return ans
        
    def check(self, i, nums, queries, min_num):    
        a = 0
        if min_num > queries[i][1]:  # 依据要求,返回-1
            return -1
        place = bisect.bisect(nums, queries[i][1])  # 这是python二分查找函数,找到比这个右边参数小的索引的右侧。
        for j in range(place):  # 再次遍历
            a = max(a, nums[j]^queries[i][0])  # 去大值 
        return a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JamePrin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值