题目:压缩算法
题目描述:
小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为m|S,例如字符串ABCABCABC将会被压缩为[3|ABC],现在小Q的同学收到了小Q发送过来的字符串,你能帮助他进行解压缩么?
输入描述:
输入第一行包含一个字符串s,代表压缩后的字符串。
S的长度<=1000;
S仅包含大写字母、[、]、|;
解压后的字符串长度不超过100000;
压缩递归层数不超过10层;
输出描述:
输出一个字符串,代表解压后的字符串。
输入例子1:
HG[3|B[2|CA]]F
输出例子1:
HGBCACABCACABCACAF
例子说明1:
HG[3|B[2|CA]]F−>HG[3|BCACA]F−>HGBCACABCACABCACAF
题目解析:
采用递归的解法,遇到“【”进行递归,递归停止标志是遇到"]",然后将“【】”中的内容展开并且
替换原来字符串的部分,每次递归时传递的是“[”之后的内容。
即:
第一次递归:3|B[2|CA]]F
第二次递归:2|CA]]F
第二次递归:没有“[”所以结束递归并返回
第二次递归返回:BCACA]F,然后与原字符串结合:HG[3|BCACA]F
第一次递归返回:BCACABCACABCACAF,与原字符串结合HGBCACABCACABCACAF
注意要去除“[”
代码实现:
string = input()
def fun(string):
for i in range(len(string)):
if string[i] == "[":
str = fun(string[i+1:])
string = string[:i] + str
if string[i] == "]":
sign = 0
while string[sign] != "|":
sign += 1
return string[sign+1:i] * int(string[:sign])+string[i+1:]
return string
string = fun(string)
print(string)
题目:逛街
题目描述:
小Q在周末的时候和他的小伙伴来到大城市逛街,一条步行街上有很多高楼,共有n座高楼排成一行。
小Q从第一栋一直走到了最后一栋,小Q从来都没有见到这么多的楼,所以他想知道他在每栋楼的位置处能看到多少栋楼呢?(当前面的楼的高度大于等于后面的楼时,后面的楼将被挡住)
输入描述:
输入第一行将包含一个数字n,代表楼的栋数,接下来的一行将包含n个数字wi(1<=i<=n),代表每一栋楼的高度。
1<=n<=100000;
1<=wi<=100000;
输出描述:
输出一行,包含空格分割的n个数字vi,分别代表小Q在第i栋楼时能看到的楼的数量。
输入例子1:
6
5 3 8 3 2 5
输出例子1:
3 3 5 4 4 4
例子说明1:
当小Q处于位置3时,他可以向前看到位置2,1处的楼,向后看到位置4,6处的楼,加上第3栋楼,共可看到5栋楼。当小Q处于位置4时,他可以向前看到位置3处的楼,向后看到位置5,6处的楼,加上第4栋楼,共可看到4栋楼。
题目解析:
先从左到右扫描,再从右向左扫描,使用栈,如果大于栈顶则进栈,然后统计栈的大小
代码实现:
n = int(input())
ls = list(map(int,input().split()))
lt = []
for i in range(n):
stack = []
#先右
stack.append(ls[i])
if i < n -1 :
maxnum = ls[i + 1]
j = i+1
stack.append(ls[j])
while j < n:
j += 1
if j > n-1 :
break
if ls[j] > stack[-1]:
stack.append(ls[j])
lt.append(len(stack))
for i in range(n-1,0,-1):
stack = []
#左
maxnum = ls[i-1]
j = i - 1
stack.append(ls[j])
while j > 0:
j -= 1
if ls[j] > stack[-1]:
stack.append(ls[j])
lt[i] += len(stack)
for i in lt:
print(i,end=" ")