190602 字符串解码
字节跳动原题,leetcode394 Decode String
解法:栈 ! 因为有嵌套,所以先出现的”[“
,它对应的”]“
越往后,先进后出,用栈可以实现。
注意,这一题有很多细节,比如:
- 出现类似
2[e3[f]]
这样嵌套的情况,需要判断,判断规则是:将当前“[”
弹出后,栈是否为空,如果不为空,说明有嵌套,需要将该字符串合并到外层是stack中继续,不能直接添加到输出list中; - 每一次弹出一组
[]
框的时候,不仅要将字符串复制前面的整数倍,而且要记得将num清空; - 不在
[]
里面包含的字符,直接添加到输出list中。
class Solution:
def decodeString(self, s: str) -> str:
if not s:
return ""
stack = []
res = []
num = ""
for ch in s:
if ch.isdigit():
num += ch
elif ch == "[":
stack.append(["", num])
num = ""
elif ch == "]":
data = stack.pop()
string, num = data[0], data[1]
if stack: # 如果stack不为空,说明有嵌套
stack[-1][0] += string * int(num)
else:
res += string * int(num)
num = ""
else:
if stack:
stack[-1][0] += ch
else:
res += ch
return "".join(res)
190602 景点的最大评分
北京有N个景点,第i个景点的评分用a[i]表示,两个景点i和j之间的距离为j - i(j > i)
,小明一天只能玩两个景点,总评分是两个景点的评分之和减去距离,即a[i] + a[j] + i - j
,问,选择哪两个景点可以使评分最大?
【输入描述:】
第一行输入N(```2 <=N <= 100000`)
第二行输入N个景点的评分(1 <= a[i] <= 1000
)
【输出描述:】
最大评分
【输入示例:】
5
11 6 5 18 12
【输出示例:】
29
190602 数组中区块的个数
题目要求:输入一个只包含0和1的二维数组,上下左右和对角相邻的1组成一个区块,0不形成区块,求数组中区块的个数。
【输入示例:】
3 3(表示3行3列)
0 1 0
1 0 0
1 0 1
【输出示例:】
2
【说明:】
除了右下角的1单独形成1个区块之外,其他的1对角或上下相邻形成1个区块。
190602 总移动距离最短