# 1 - 2164. Sort Even and Odd Indices Independently
class Solution: | |
def sortEvenOdd(self, nums: List[int]) -> List[int]: | |
n1 = sorted(nums[::2]) | |
n2 = sorted(nums[1::2], reverse=True) | |
ans = [] | |
for i in range(len(nums)): | |
ans.append(n1[i//2] if i % 2 == 0 else n2[i//2]) | |
return ans |
# 2 - 2165. Smallest Value of the Rearranged Number
class Solution: | |
def smallestNumber(self, num: int) -> int: | |
ctr = Counter(str(num) if num > 0 else str(-num)) | |
items = [[int(x), y] for x, y in ctr.items()] | |
items.sort() | |
ans = 0 | |
if num > 0: | |
i = 0 | |
while i < len(items) and items[i][0] == 0: i += 1 | |
ans = items[i][0] * (10 ** (sum(y for x, y in items[:i]))) | |
items[i][1] -= 1 | |
while i < len(items): | |
while items[i][1] > 0: | |
ans = ans * 10 + items[i][0] | |
items[i][1] -= 1 | |
i += 1 | |
else: | |
items = items[::-1] | |
i = 0 | |
while i < len(items): | |
while items[i][1] > 0: | |
ans = ans * 10 + items[i][0] | |
items[i][1] -= 1 | |
i += 1 | |
ans = -ans | |
return ans |
感觉这道题作为第二题有点烦。
# 3 - 2166. Design Bitset
class Bitset: | |
def __init__(self, size: int): | |
self.flipmask = (1 << size) - 1 | |
self.cnt = 0 | |
self.size = size | |
self.bits = 0 | |
def fix(self, idx: int) -> None: | |
if not self.bits & (1 << self.size - 1 - idx): self.cnt += 1 | |
self.bits = self.bits | (1 << (self.size - 1 - idx)) | |
def unfix(self, idx: int) -> None: | |
if self.bits & (1 << (self.size - 1 - idx)): self.cnt -= 1 | |
self.bits = self.bits & (self.flipmask ^ (1 << (self.size - 1 - idx))) | |
def flip(self) -> None: | |
self.cnt = self.size - self.cnt | |
self.bits = self.bits ^ self.flipmask | |
def all(self) -> bool: | |
return self.bits == self.flipmask | |
def one(self) -> bool: | |
return self.bits != 0 | |
def count(self) -> int: | |
return self.cnt | |
def toString(self) -> str: | |
s = bin(self.bits)[2:] if self.bits > 0 else bin(self.bits)[3:] | |
return "0" * (self.size - len(s)) + s | |
# Your Bitset object will be instantiated and called as such: | |
# obj = Bitset(size) | |
# obj.fix(idx) | |
# obj.unfix(idx) | |
# obj.flip() | |
# param_4 = obj.all() | |
# param_5 = obj.one() | |
# param_6 = obj.count() | |
# param_7 = obj.toString() |
要确保所有操作都接近 O (1),不然肯定会 TLE。重点是 cnt 和 flipmask 这两个变量。
# 4 - 2167. Minimum Time to Remove All Cars Containing Illegal Goods
求最小的移除所有有违规货物的车的代价。可以从头部或者尾部移除一辆车,代价是 1,也可以从中间移除任意一辆车,代价是 2。
class Solution: | |
def minimumTime(self, s: str) -> int: | |
n = len(s) | |
pre = [0] * (n + 2) | |
suf = [0] * (n + 2) | |
for i in range(n): | |
pre[i + 1] = pre[i] if s[i] == '0' else min(pre[i] + 2, i + 1) | |
pre[n + 1] = pre[n] | |
for i in range(n - 1, -1, -1): | |
suf[i + 1] = suf[i + 2] if s[i] == '0' else min(suf[i + 2] + 2, n - i) | |
suf[0] = suf[1] | |
return min(pre[i] + suf[i+1] for i in range(n + 1)) |
前后缀分解 + DP,和昨天双周赛的第四题有点相似。pre 和 suf 的前后都空出来一个表示不选的。
参考自 前后缀分解 + DP
class Solution: | |
def minimumTime(self, s): | |
left, res, n = 0, len(s), len(s) | |
for i,c in enumerate(s): | |
left = min(left + (c == '1') * 2, i + 1) | |
res = min(res, left + n - 1 - i) | |
return res |
参考自 [Java/C++/Python] One-Pass, O(1) Space
emmm…… 佩服到五体投地。