链接: 5242. 兼具大小写的最好英文字母
给你一个由英文字母组成的字符串 s ,请你找出并返回 s 中的 最好 英文字母。返回的字母必须为大写形式。如果不存在满足条件的字母,则返回一个空字符串。
最好 英文字母的大写和小写形式必须 都 在 s 中出现。
英文字母 b 比另一个英文字母 a 更好 的前提是:英文字母表中,b 在 a 之 后 出现。
定级Easy。
按题意模拟即可。
大小写转换技巧:
class Solution:
def greatestLetter(self, s: str) -> str:
ans = ''
visited = set(s)
for c in s:
d = chr(ord(c)^32)
if d in visited:
ans = max(ans,chr(ord(d)&-33))
if len(ans) ==0:
return ans
return ans
链接: 5218. 个位数字为 K 的整数之和
给你两个整数 num
和 k
,考虑具有以下属性的正整数多重集:
k
。num
。注意:
定级Medium。
class Solution:
def minimumNumbers(self, num: int, k: int) -> int:
if num == 0:
return 0
w = num%10
cnt = defaultdict(lambda :10**9) # k的倍数尾数最小倍数
min_mul = defaultdict(lambda :10**9)
for i in range(1,11):
wei = k*i%10
cnt[wei] = min(cnt[wei],i)
min_mul[wei] = min(min_mul[wei],k*i)
if w not in cnt:
return -1
if num < k * cnt[w]:
return -1
return cnt[w]
链接: 6099. 小于等于 K 的最长二进制子序列
给你一个二进制字符串 s 和一个正整数 k 。
请你返回 s 的 最长 子序列,且该子序列对应的 二进制 数字小于等于 k 。
注意:
定级Medium。
class Solution:
def longestSubsequence(self, s: str, k: int) -> int:
n = len(s)
a = [0]*(n+1)
for i in range(1,n+1):
a[i] = a[i-1]
if s[i-1] == '0':
a[i] += 1
# print(a)
ans = max(a)
t = ''
for i in range(n-1,-1,-1):
t = s[i] + t
while t and int(t,2)>k:
t = t[:-1]
if int(t,2)<=k:
ans = max(ans,len(t)+a[i])
return ans
链接: 5254. 卖木头块
给你两个整数 m 和 n ,分别表示一块矩形木块的高和宽。同时给你一个二维整数数组 prices ,其中 prices[i] = [hi, wi, pricei] 表示你可以以 pricei 元的价格卖一块高为 hi 宽为 wi 的矩形木块。
每一次操作中,你必须按下述方式之一执行切割操作,以得到两块更小的矩形木块:
请你返回切割一块大小为 m x n 的木块后,能得到的 最多 钱数。
注意你可以切割木块任意次。
定级Hard。
这题把我卡没了。
比赛结束一瞬间想到模拟思路:
令dfs(wood)为一块大小m,n的木头的最大价值
class Solution:
def sellingWood(self, m: int, n: int, prices: List[List[int]]) -> int:
p = {(a,b):c for a,b,c in prices}
@cache
def dfs(x,y):
if x == 0 or y == 0:
return 0
s = 0
if (x,y) in p:
s = p[(x,y)]
for i in range(1,x):
s = max(s,dfs(i,y)+dfs(x-i,y))
for i in range(1,y):
s = max(s,dfs(x,i)+dfs(x,y-i))
return s
return dfs(m,n)