竞赛地址
T1
第一题保存数字然后排序还要多说什么么?
class Solution:
def secondHighest(self, s: str) -> int:
res = []
for ch in s:
if ch.isdigit():
res.append(int(ch))
res = list(set(res))
if len(res) <= 1:
return -1
print(res)
res.sort()
return res[-2]
T2
第二题也直接模拟
class AuthenticationManager:
def __init__(self, timeToLive: int):
self.time = timeToLive
self.dic = {}
def generate(self, tokenId: str, currentTime: int) -> None:
if tokenId not in self.dic:
self.dic[tokenId] = currentTime
def renew(self, tokenId: str, currentTime: int) -> None:
if tokenId not in self.dic:
return
if self.dic[tokenId] + self.time <= currentTime:
del self.dic[tokenId]
else:
self.dic[tokenId] = currentTime
def countUnexpiredTokens(self, currentTime: int) -> int:
cnt = 0
for tokenId in self.dic:
if self.dic[tokenId] + self.time > currentTime:
cnt += 1
return cnt
# Your AuthenticationManager object will be instantiated and called as such:
# obj = AuthenticationManager(timeToLive)
# obj.generate(tokenId,currentTime)
# obj.renew(tokenId,currentTime)
# param_3 = obj.countUnexpiredTokens(currentTime)
T3
注意到题目要求是从0开始
所以先排序,对每个
n
i
n_i
ni来说,如果前缀和
s
i
+
1
<
n
i
s_i + 1< n_i
si+1<ni则停止,因为已经不连续了,返回
s
i
+
1
s_i+1
si+1,否则计算前缀和到下一个
class Solution:
def getMaximumConsecutive(self, coins: List[int]) -> int:
coins.sort()
if coins[0] != 1:
return 1
dp = [0 for _ in coins]
dp[0] = 1 if coins[0] != 1 else 2
pre = coins[0]
for i in range(1,len(coins)):
if coins[i] <= pre + 1:
dp[i] = dp[i-1] + coins[i]
else:
return dp[i - 1]
pre += coins[i]
print(dp)
return dp[-1]
T4
数据量告诉我们要回溯,完。
class Solution:
def maxScore(self, nums: List[int]) -> int:
n = len(nums)
mask = (1 << n) - 1
@cache
def dfs(s, cnt):
if s == mask:
return 0
ans = 0
for i in range(n):
if not s >> i & 1:
for j in range(n):
if j != i and not s >> j & 1:
ns = s | 1 << i | 1 << j
if cnt * gcd(nums[i], nums[j]) + dfs(ns, cnt + 1) > ans:
ans = cnt * gcd(nums[i], nums[j]) + dfs(ns, cnt + 1)
return ans
return dfs(0, 1)