python可以做力扣的题吗_力扣周赛 198 - python 解答

做出了四道题目,但后两道做的很勉强,也错了几次。刚看第三道题,虽然写着 medium,但是没思路,打开第四道看到反而已经有人过了,于是先做了第四道,才回来做第一道。

最后一道是纯暴力枚举加了几个条件:

去除相邻重复值

是函数输出为 0 时停止枚举,因为 0 按位与任何数都依然是 0.

因为在不断按位与的过程中函数输出是单调减的,所以,但差值大于当前最小差值也可以停止遍历

但是我感觉应该还有更好的解法

第三题用的模拟方法,依次寻找只含一个字母,两个字母 ... 的串

5464 换酒问题

class Solution:

def numWaterBottles(self, numBottles: int, numExchange: int) -> int:

c = numBottles

cc = numBottles

kp = numBottles

while kp >= numExchange:

cc = kp // numExchange

kp = kp % numExchange + cc

c += cc

return c

5465 子树中标签相同的节点数

class Solution:

def countSubTrees(self, n: int, edges: List[List[int]], labels: str) -> List[int]:

ed = {}

for s, e in edges:

if s not in ed:

ed[s] = []

if e not in ed:

ed[e] = []

ed[s].append(e)

ed[e].append(s)

ans = [0] * n

vised = [False] * n

def vis(i):

vised[i] = True

c = {}

c[labels[i]] = 1

if i in ed:

for ch in ed[i]:

if not vised[ch]:

cc = vis(ch)

for k in cc:

if k not in c:

c[k] = 0

c[k] += cc[k]

ans[i] = c[labels[i]]

return c

vis(0)

return ans

5466 最多的不重叠子字符串

class Solution:

def maxNumOfSubstrings(self, s: str) -> List[str]:

d = {}

for i, ch in enumerate(s):

if ch not in d:

d[ch] = [i, i, True]

else:

if d[ch][1] != i - 1:

d[ch][2] = False

d[ch][1] = i

#print(d)

used = {}

ans = []

nd = []

for ch in d:

if d[ch][2]:

used[ch] = True

ans.append(s[d[ch][0]:d[ch][1]+1])

for ch in d:

if not d[ch][2]:

cc = 0

ccx = set()

f = True

mini = d[ch][0]

maxi = d[ch][1]

change = True

while change:

change = False

i = d[ch][0]

while i <= maxi:

if s[i] in used:

f = False

break

else:

if maxi < d[s[i]][1]:

change = True

maxi = d[s[i]][1]

if mini > d[s[i]][0]:

mini = d[s[i]][0]

change = True

ccx.add(s[i])

i += 1

i = d[ch][0]

while i >= mini:

if s[i] in used:

f = False

break

else:

if maxi < d[s[i]][1]:

change = True

maxi = d[s[i]][1]

if mini > d[s[i]][0]:

mini = d[s[i]][0]

change = True

ccx.add(s[i])

i -= 1

d[ch][1] = maxi

d[ch][0] = mini

if f:

nd.append([len(ccx), maxi-d[ch][0], ch, list(ccx)])

#print(d)

nd.sort()

for n in nd:

f = True

for cc in n[3]:

if cc in used:

f = False

break

if f:

for cc in n[3]:

used[cc] = True

ch = n[2]

ans.append(s[d[ch][0]:d[ch][1]+1])

return ans

5467 找到最接近目标值的函数值

class Solution:

def closestToTarget(self, arr: List[int], target: int) -> int:

arr2 = []

l = arr[0] -1

for v in arr:

if v != l:

arr2.append(v)

l = v

#print(len(arr), len(arr2))

arr = arr2

r = abs(-1000000000 - target)

for i in range(len(arr)):

ans = arr[i]

r = min(r, abs(ans - target))

for j in range(i+1, len(arr)):

ans = ans & arr[j]

r = min(r, abs(ans - target))

if ans == 0 or r == 0:

break

if target > ans and target - ans >= r:

break

if r == 0:

break

return r

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值