前言
继续leetcode刷题生涯
这里记录的都是笔者觉得有点意思的做法
参考了好几位大佬的题解,感谢各位大佬
1111. 有效括号的嵌套深度
class Solution:
def maxDepthAfterSplit(self, seq: str) -> List[int]:
n = len(seq)
res = [0] * n
for i in range(1, n):
if seq[i] == seq[i-1]:
res[i] = 1 - res[i-1]
else:
res[i] = res[i-1]
return res
1114. 按序打印
import threading
class Foo:
def __init__(self):
self.l1 = threading.Lock()
self.l1.acquire()
self.l2 = threading.Lock()
self.l2.acquire()
def first(self, printFirst: 'Callable[[], None]') -> None:
printFirst()
self.l1.release()
def second(self, printSecond: 'Callable[[], None]') -> None:
self.l1.acquire()
printSecond()
self.l2.release()
def third(self, printThird: 'Callable[[], None]') -> None:
self.l2.acquire()
printThird()
# event
import threading
class Foo:
def __init__(self):
self.e1 = threading.Event()
self.e2 = threading.Event()
def first(self, printFirst: 'Callable[[], None]') -> None:
printFirst()
self.e1.set()
def second(self, printSecond: 'Callable[[], None]') -> None:
self.e1.wait()
printSecond()
self.e2.set()
def third(self, printThird: 'Callable[[], None]') -> None:
self.e2.wait()
printThird()
1115. 交替打印FooBar
# 信号量
import threading
class FooBar:
def __init__(self, n):
self.n = n
self.s1 = threading.Semaphore(1)
self.s2 = threading.Semaphore(0)
def foo(self, printFoo: 'Callable[[], None]') -> None:
for i in range(self.n):
self.s1.acquire()
printFoo()
self.s2.release()
def bar(self, printBar: 'Callable[[], None]') -> None:
for i in range(self.n):
self.s2.acquire()
printBar()
self.s1.release()
# 字典
class FooBar:
def __init__(self, n):
self.n = n
self.d = {
}
def foo(self, printFoo: 'Callable[[], None]') -> None:
self.d['f'] = printFoo
self.res()
def bar(self, printBar: 'Callable[[], None]') -> None:
self.d['b'] = printBar
self.res()
def res(self) -> None:
if len(self.d) == 2:
for i in range(self.n):
self.d['f']()
self.d['b']()
1116. 打印零与奇偶数
import threading
class ZeroEvenOdd:
def __init__(self, n):
self.n = n + 1
self.Zero = threading.Semaphore(1)
self.Even = threading.Semaphore(0)
self.Odd = threading.Semaphore(0)
# printNumber(x) outputs "x", where x is an integer.
def zero(self, printNumber: 'Callable[[int], None]') -> None:
for i in range(1, self.n):
self.Zero.acquire()
printNumber(0)
if i % 2 == 1:
self.Odd.release()
else:
self.Even.release()
def even(self, printNumber: 'Callable[[int], None]') -> None:
for i in range(1, self.n):
if i % 2 == 0:
self.Even.acquire()
printNumber(i)
self.Zero.release()
def odd(self, printNumber: 'Callable[[int], None]') -> None:
for i in range(1, self.n):
if i % 2 == 1:
self.Odd.acquire()
printNumber(i)
self.Zero.release()
1117. H2O 生成
from threading import Semaphore
class H2O:
def __init__(self):
self.hsem = Semaphore(2)
self.osem = Semaphore(1)
self.hydrogenCount = 0
def hydrogen(self, releaseHydrogen: 'Callable[[], None]') -> None:
# releaseHydrogen() outputs "H". Do not change or remove this line.
self.hsem.acquire()
releaseHydrogen()
self.hydrogenCount += 1
if self.hydrogenCount >= 2:
self.hydrogenCount -= 2
self.osem.release()
def oxygen(self, releaseOxygen: 'Callable[[], None]') -> None:
# releaseOxygen() outputs "O". Do not change or remove this line.
self.osem.acquire()
releaseOxygen()
self.hsem.release()
self.hsem.release()