第371场周赛

发布时间 2023-11-12 11:28:08作者: LYoungH

至少在态度上有进步 昨天参加了 今天也参加了

 

 跟昨晚的类似 第一题和第四题都是一样的 但是plus版要求时间复杂度

给你一个下标从 0 开始的整数数组 nums 。如果一对整数 x 和 y 满足以下条件,则称其为 强数对 :

  • |x - y| <= min(x, y)

你需要从 nums 中选出两个整数,且满足:这两个整数可以形成一个强数对,并且它们的按位异或(XOR)值是在该数组所有强数对中的 最大值 。

返回数组 nums 所有可能的强数对中的 最大 异或值。

注意,你可以选择同一个整数两次来形成一个强数对。

 

示例 1:

输入:nums = [1,2,3,4,5]
输出:7
解释:数组 nums 中有 11 个强数对:(1, 1), (1, 2), (2, 2), (2, 3), (2, 4), (3, 3), (3, 4), (3, 5), (4, 4), (4, 5) 和 (5, 5) 。
这些强数对中的最大异或值是 3 XOR 4 = 7 。
class Solution(object):
    def maximumStrongPairXor(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        l = len(nums)
        ans = 0
        for i in range(l-1):
            for j in range(i+1,l):
                if abs(nums[i]-nums[j])<=min(nums[i],nums[j]):
                    ans = max(ans,nums[i]^nums[j])
        return ans
                

4分钟过

--------------------------------------第二题----------------------------------

给你一个长度为 n 、下标从 0 开始的二维字符串数组 access_times 。对于每个 i0 <= i <= n - 1 ),access_times[i][0] 表示某位员工的姓名,access_times[i][1] 表示该员工的访问时间。access_times 中的所有条目都发生在同一天内。

访问时间用 四位 数字表示, 符合 24 小时制 ,例如 "0800" 或 "2250" 。

如果员工在 同一小时内 访问系统 三次或更多 ,则称其为 高访问 员工。

时间间隔正好相差一小时的时间 不 被视为同一小时内。例如,"0815" 和 "0915" 不属于同一小时内。

一天开始和结束时的访问时间不被计算为同一小时内。例如,"0005" 和 "2350" 不属于同一小时内。

以列表形式,按任意顺序,返回所有 高访问 员工的姓名。

 

示例 1:

输入:access_times = [["a","0549"],["b","0457"],["a","0532"],["a","0621"],["b","0540"]]
输出:["a"]
解释:"a" 在时间段 [05:32, 06:31] 内有三条访问记录,时间分别为 05:32 、05:49 和 06:21 。
但是 "b" 的访问记录只有两条。
因此,答案是 ["a"] 。

class Solution(object):
    def findHighAccessEmployees(self, access_times):
        """
        :type access_times: List[List[str]]
        :rtype: List[str]
        """
        ans = list()
        access_dict = {}  
        for item in access_times:  
            key, value = item  
            if key in access_dict:  
                access_dict[key].append(value)  
            else:  
                access_dict[key] = [value]  
        for key, value_list in access_dict.items():  
            n = len(value_list)
            count = 0
            if n<3:
                continue
            else:
                value_list.sort()
                for indx in range(0,n-2):
                    start_time=value_list[indx]
                    if int(value_list[indx+1])-int(start_time)<100 and int(value_list[indx+2])-int(start_time)<100:
                        ans.append(key)
                        continue


        return list(set(ans))

先根据人分类 每个人的时间再排序

然后再一次判断每个人的

滑动窗口的思想

前几次没考虑到 0010 0040 0120 0130 这种 

        for key, value_list in access_dict.items():  
            n = len(value_list)
            count = 0
            if n<3:
                continue
            else:
                value_list.sort()
                start_time = value_list[0]
                for i in range(1,n):
                    if int(value_list[i])-int(start_time)<100:
                        count=count+1
                        if(count==2):
                            ans.append(key)
                            continue
                    else:
                        count = 0
                        start_time=value_list[i]

 

判断到0120 超过0010的一小时之后 就把起点设置到0120去了 事实上以0040为起点是满足条件的

于是直接 三位三位 这样判断

 

错了五次 耽误了一些时间 但是有几次是相同的代码提交 因为没记住错误的地方 批评