5440. 數組異或操作
給你兩個整數,n 和 start 。
數組 nums 定義爲:nums[i] = start + 2*i(下標從 0 開始)且 n == nums.length 。
請返回 nums 中所有元素按位異或(XOR)後得到的結果。
提示:
1 <= n <= 1000
0 <= start <= 1000
n == nums.length
算法
因爲不管怎麼看都很簡單,所以:
class Solution(object):
def xorOperation(self, n, start):
res=0
for i in range(n):
k=start+2*i
res^=k
return res
5441. 保證文件名唯一
給你一個長度爲 n 的字符串數組 names 。你將會在文件系統中創建 n 個文件夾:在第 i 分鐘,新建名爲 names[i] 的文件夾。
由於兩個文件 不能 共享相同的文件名,因此如果新建文件夾使用的文件名已經被佔用,系統會以 (k) 的形式爲新文件夾的文件名添加後綴,其中 k 是能保證文件名唯一的 最小正整數 。
返回長度爲 n 的字符串數組,其中 ans[i] 是創建第 i 個文件夾時系統分配給該文件夾的實際名稱。
!其實這個保證文件名唯一的描述就是現在計算機裏所使用的,唯一讓人不熟悉的就是:
輸入:names = ["kaido","kaido(1)","kaido","kaido(1)"]
輸出:["kaido","kaido(1)","kaido(2)","kaido(1)(1)"]
解釋:注意,如果含後綴文件名被佔用,那麼系統也會按規則在名稱後添加新的後綴 (k) 。
提示:
1 <= names.length <= 5 * 10^4
1 <= names[i].length <= 20
names[i] 由小寫英文字母、數字和/或圓括號組成。
算法
class Solution(object):
def getFolderNames(self, names):
# res:輸出
# d:儲存已分配的文件名
res,d = [],{}
for i in names:
# 遍歷列表,當文件名未分配時,……(見下方省略號段)
if i in d:
# 當文件名已分配時,取出已使用的最小後綴,進入while循環,
# 找出未使用的最小後綴,更新最小後綴
k=d[i][0]
while k in d[i][1] or '%s(%d)'%(i,k) in d:
if k in d:
d[i][1].add(k)
k+=1
d[i][0]=k
d[i][1].add(k)
i='%s(%d)'%(i,k)
# ……
# 未分配時,將當前文件名保存到字典
# 值域是列表,其中元素0表示當前已使用的最小後綴,元素1是集合,保存所有已使用的後綴
d[i] = [0, {0}]
res.append(i)
return res
5442. 避免洪水氾濫
你的國家有無數個湖泊,所有湖泊一開始都是空的。當第 n 個湖泊下雨的時候,如果第 n 個湖泊是空的,那麼它就會裝滿水,否則這個湖泊會發生洪水。你的目標是避免任意一個湖泊發生洪水。
給你一個整數數組 rains ,其中:
- rains[i] > 0 表示第 i 天時,第 rains[i] 個湖泊會下雨。
- rains[i] == 0 表示第 i 天沒有湖泊會下雨,你可以選擇 一個 湖泊並 抽乾 這個湖泊的水。
請返回一個數組 ans ,滿足:
- ans.length == rains.length
- 如果 rains[i] > 0 ,那麼ans[i] == -1 。
- 如果 rains[i] == 0 ,ans[i] 是你第 i 天選擇抽乾的湖泊。
如果有多種可行解,請返回它們中的 任意一個 。如果沒辦法阻止洪水,請返回一個 空的數組 。
請注意,如果你選擇抽乾一個裝滿水的湖泊,它會變成一個空的湖泊。但如果你選擇抽乾一個空的湖泊,那麼將無事發生(詳情請看示例 4)。
輸入:rains = [69,0,0,0,69]
輸出:[-1,69,1,1,-1]
解釋:任何形如 [-1,69,x,y,-1], [-1,x,69,y,-1] 或者 [-1,x,y,69,-1] 都是可行的解,其中 1 <= x,y <= 10^9
算法
class Solution(object):
def avoidFlood(self, rains):
'''
res:輸出數組
qian:字典,表示水庫是在第幾天灌滿的
kong:表示不下雨的日子
'''
res=[None]*len(rains)
qian={}
kong=[]
for j,i in enumerate(rains):
if i>0 :
if i not in qian:
qian[i]=j
res[j]=-1
else:
if not kong:return []
else:
for idx in kong:
if idx>qian[i]:
kong.remove(idx)
break
else:
return []
res[idx]=i
res[j]=-1
qian[i]=j
elif i==0:
kong.append(j)
for i in kong:
res[i]=1
return res
5443. 找到最小生成樹裏的關鍵邊和僞關鍵邊
給你一個 n 個點的帶權無向連通圖
,節點編號爲 0 到 n-1 ,同時還有一個數組 edges ,其中 edges[i] = [fromi, toi, weighti]
表示在 fromi 和 toi 節點之間有一條帶權無向邊。最小生成樹 (MST) 是給定圖中邊的一個子集,它連接了所有節點且沒有環,而且這些邊的權值和最小。
請你找到給定圖中最小生成樹的所有關鍵邊和僞關鍵邊。如果最小生成樹中刪去某條邊,會導致最小生成樹的權值和增加,那麼我們就說它是一條關鍵邊。僞關鍵邊則是可能會出現在某些最小生成樹中但不會出現在所有最小生成樹中的邊。
請注意,你可以分別以任意順序返回關鍵邊的下標和僞關鍵邊的下標。
輸入:n = 5, edges = [[0,1,1],[1,2,1],[2,3,2],[0,3,2],[0,4,3],[3,4,3],[1,4,6]]
輸出:[[0,1],[2,3,4,5]]
解釋:上圖描述了給定圖。
下圖是所有的最小生成樹。
注意到第 0 條邊和第 1 條邊出現在了所有最小生成樹中,所以它們是關鍵邊,我們將這兩個下標作爲輸出的第一個列表。
邊 2,3,4 和 5 是所有 MST 的剩餘邊,所以它們是僞關鍵邊。我們將它們作爲輸出的第二個列表。
算法
在圖這方面還是很不熟練啊,暫且擱置,日後填坑。
總結
日常丟人。