【第195场周赛】前3题Python解题思路

mark一下,终于不是隔着时差半夜爬起来写周赛了,这次也是排名最好的一次,刚进300(不要嘲笑我)。

题目1:
5440. 数组异或操作

class Solution:
    def xorOperation(self, n: int, start: int) -> int:
        nums=[0]*n
        for i in range(n):
            nums[i] = start + 2*i
        if n==1:
            return nums[0]
        else:
            ans=nums[0]
            for kk in range(1,n):
                ans=ans^nums[kk]
            return ans

题目2:
5441. 保证文件名唯一
解题思路:
用dict记录当前文件名已出现次数,生成的新文件名也需要判断是否已使用过。

class Solution:
    def getFolderNames(self, names: List[str]) -> List[str]:
        n=len(names)
        ans=[]
        numdict=defaultdict(int)
        for i in range(n):
            if numdict[names[i]]==0:
                ans.append(names[i])
                numdict[names[i]]+=1
            else:
                diff=numdict[names[i]]
                new_name=names[i]+'('+str(diff)+')'                
                while numdict[new_name]!=0:
                    diff+=1
                    new_name=names[i]+'('+str(diff)+')'
                ans.append(new_name)
                numdict[names[i]]=diff+1
                numdict[new_name]=1
        return ans

题目3:
5442. 避免洪水泛滥
解题思路:
若当天下雨:
判断当前湖泊是否被填满,若否,则今天被填满,记录这个湖泊被填满的时间;若是,则看这天之前是否有抽干湖泊的机会(判断依据:这个湖泊之前被填满的时间到今天之间是否有可用的抽干机会),若有,则这天下雨后,该湖泊被填满,若之前无抽干机会,则没有办法阻止洪水,break
若当天不下雨:
则当天可以用来抽干湖泊,记录共有多少天可用于抽干湖泊,以及哪些天可以用于抽干湖泊

class Solution:
    def avoidFlood(self, rains: List[int]) -> List[int]:
        mydict=defaultdict(int)
        raindict=defaultdict(int)
        res=0
        n=len(rains)
        ans=[1]*n
        res_loc=[]
        wecan=1
        for i in range(n):
            if rains[i]!=0:                
                
                if mydict[rains[i]]==0: # rains[i] is the No. of lake 
                    ans[i]=-1  # can rain 
                    mydict[rains[i]]+=1 # lake is full
                    raindict[rains[i]]=i
                     # time for lake is full
                else: # lake is full
                    if res>0: # can lake be clean before
                        flag=0
                        for k in range(res):
                            if res_loc[k]>raindict[rains[i]] and res_loc[k]<i:
                                ans[res_loc[k]]=rains[i]
                                ans[i]=-1
                                raindict[rains[i]]=i
                                res_loc.pop(k)
                                res-=1
                                flag=1
                                break
                        if flag==0:
                            wecan=0
                            break
                    else:
                        wecan=0
                        break
            else: # no rain 
                res+=1
                res_loc.append(i)
        if i<n-1 or wecan==0:
            return []
        return ans

你可能感兴趣的:(leetcode)