这是我参与11月更文挑战的第13天,活动详情查看2021最后一次更文挑战
链接
周赛一共四道题,今天是后两道题的解析。
这次周赛的题目较为简单,前三道都可以用简单模拟来解决,最后一道题只要学习和做过并查集也可以较为简单的解决。
题目
2075. 解码斜向换位密码
模拟
解析
这道题的工作量主要在读懂题目的意思和想明白编码解码的规律。编码后的斜向密码一定会保证倒数第二个左上到右下的斜列填满字符(即有rows个),最后一个编码后的列可能填满了字符也可能不满,不填满字符的话则后续的位置都为空。
模拟的过程就是把从第一个斜列开始到最后一个斜列的所有字符都顺序保存下来,利用最后一个合法字符不为空的条件,把后续的空字符去除即可。
在下面写法中为了循环内编码方便,为整个字符串添加了一个空字符。
代码
class Solution:
def decodeCiphertext(self, encodedText: str, rows: int) -> str:
cols = len(encodedText) // rows
listCount = cols - rows + 2
encodedText += ' '
ans = ''
for i in range(0, listCount):
for j in range(0, rows):
ind = j * cols + i+j
ans += encodedText[ind]
while len(ans) > 0 and ans[-1] == ' ':
ans = ans[:-1]
return ans
2076. 处理含限制条件的好友请求
并查集+哈希表
解析
间接好友的关系属于集合,对集合的判断和处理一般用并查集来高效的解决。
具体的写法有两种:
- 一种是下面第一种写法,先把restrictions关系存入每个元素的哈希表,然后判断间接关系时对哈希表的每个项做判断和处理
- 另一种是在判断是否存在间接朋友关系时对每一个restriction进行判断,对应下面第二种写法。
代码
class Solution:
def friendRequests(self, n: int, restrictions: List[List[int]], requests: List[List[int]]) -> List[bool]:
relations = [defaultdict(bool) for _ in range(0, n)]
self.unions = [i for i in range(0, n)]
for (i, restriction) in enumerate(restrictions):
a, b = restriction
relations[a][i] = True
relations[b][i] = True
ans = []
for request in requests:
a, b = request
unionsA, unionsB = self.getUnions(a), self.getUnions(b)
if unionsA == unionsB:
ans.append(True)
else:
relationA, relationB = relations[unionsA], relations[unionsB]
canBeFriend = True
for item in relationB:
if item in relationA:
canBeFriend = False
break
if canBeFriend:
self.unions[unionsB] = self.unions[unionsA]
ans.append(True)
for item in relationB:
relationA[item] = True
else:
ans.append(False)
return ans
def getUnions(self, ind):
if self.unions[ind] != ind:
root = self.getUnions(self.unions[ind])
return root
else:
return ind