1、数组异或操作
1、题目描述:
2、题解:
先求出数组nums,然后按位异或即可。
class Solution:
def xorOperation(self, n: int, start: int) -> int:
nums = []
temp = 0
for i in range(n):
temp = start + 2 * i
nums.append(temp)
res = 0
for num in nums:
res ^= num
return res
2、保证文件名唯一
1、题目描述:
2、题解:
哈希集合,但是最后超时
class Solution:
def getFolderNames(self, names) :
#哈希集合
hashset = set()
res = []
for s in names:
if s not in hashset:
res.append(s)
hashset.add(s)
else:
i = 1
while s + "(%d)" % i in hashset:
i += 1
res.append(s + "(%d)" % i)
hashset.add(s + "(%d)" % i))
return res
哈希表,通过:
class Solution:
def getFolderNames(self, names) :
#哈希集合
hashset = set()
hashdict = dict()
res = []
for name in names:
if name not in hashset:
res.append(name)
hashset.add(name)
hashdict[name] = 1
else:
i = 1 if name not in hashdict else hashdict[name]
mask = name + "(%d)"
while True:
upd = mask % i
if upd not in hashset:
res.append(upd)
hashset.add(upd)
hashdict[name] = i + 1
break
i += 1
return res
3、避免洪水泛滥
1、题目描述:
2、题解:
class Solution:
def avoidFlood(self, rains: List[int]) -> List[int]:
mk, n = {}, len(rains)
nex = [0]*n
i = n-1
while i>=0:
m = rains[i]
if m in mk:
nex[i]=mk[m]
else:
nex[i]=n+1
mk[m]=i
i-=1
from heapq import heappush, heappop
heap = []
i = 0
res = [0]*n
st = set()
while i<n:
if rains[i]:
res[i]=-1
if rains[i] in st: return []
st.add(rains[i])
heappush(heap, (nex[i], rains[i]))
else:
if heap:
nn, ii = heappop(heap)
res[i]=ii
st.remove(ii)
else:
res[i]=1
i+=1
return res
4、找到最小生成树里的关键边和伪关键边
1、题目描述:
2、题解:
class Solution:
def findCriticalAndPseudoCriticalEdges(self, n: int, edges: List[List[int]]) -> List[List[int]]:
gid = [0]*(n+1)
gc = [0]*(n+1)
def findg(g):
while gid[g]!=g:
g=gid[g]
return g
ne = sorted([(e[2], e[0], e[1], i) for i,e in enumerate(edges)])
m = len(edges)
mk = [0]*m
for i in range(-1, m):
for j in range(n):
gid[j]=j
gc[j]=1
c, ww = n, 0
for k in range(m):
if k==i: continue
w, a, b, _ = ne[k]
ga, gb = findg(a), findg(b)
if ga==gb: continue
if gc[ga]>gc[gb]:
gid[gb]=ga;
gc[ga]+=gc[gb]
else:
gid[ga]=gb
gc[gb]+=gc[ga]
c-=1
ww += w
if i==-1: mw=ww
else:
if c!=1 or mw!=ww:
mk[ne[i][3]] |= 1
for i in range(m):
for j in range(n):
gid[j]=j
gc[j]=1
w, a, b, ii = ne[i]
gid[a]=b
gc[b]+=gc[a]
c, ww = n-1, w
for k in range(m):
if k==i: continue
w, a, b, _ = ne[k]
ga, gb = findg(a), findg(b)
if ga==gb: continue
if gc[ga]>gc[gb]:
gid[gb]=ga;
gc[ga]+=gc[gb]
else:
gid[ga]=gb
gc[gb]+=gc[ga]
c-=1
ww += w
if mw==ww:
mk[ii] |= 2
r1, r2 = [], []
for i in range(m):
if mk[i] & 1: r1.append(i)
elif mk[i]&2: r2.append(i)
return [r1,r2]