1、压缩算法:
小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为m|S,例如字符串ABCABCABC将会被压缩为[3|ABC],现在小Q的同学收到了小Q发送过来的字符串,你能帮助他进行解压缩么?
输入描述:
输入第一行包含一个字符串s,代表压缩后的字符串。
S的长度<=1000;
S仅包含大写字母、[、]、|;
解压后的字符串长度不超过100000;
压缩递归层数不超过10层;
输出描述:输出一个字符串,代表解压后的字符串。
示例1
输入
HG[3|B[2|CA]]F
输出
HGBCACABCACABCACAF
说明
HG[3|B[2|CA]]F−>HG[3|BCACA]F−>HGBCACABCACABCACAF
解析:这个题考的是“栈”这个知识点,用LinkedList实现。
stack_res:保存暂时存在’]‘之前记录的结果
mutil_stack:保存的数字
在遇到’]'时,从multi_stack中取出数字,对当前字符串复制n次。再从stack_res中取出之前的结果进行拼接。
需要注意的是,在stack_res中保存的是字符串,而在遇到[之前的字符串已经存进去一次,removeLast取出的是遇到[之后的一组字符串
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.next();
StringBuilder temp=new StringBuilder();
LinkedList<String> stack_res=new LinkedList<>();
LinkedList<Integer> mul_stack=new LinkedList<>();
int multi=0;
for(int i=0;i<str.length();i++){
if(str.charAt(i)=='['){
//当遇到[时,将之前的结果都保存在栈中
stack_res.add(temp.toString());
temp=new StringBuilder();
}else if(str.charAt(i)==']'){
//当遇到]时,从数字栈中找到最后的数字,然后将最近保存
StringBuilder temp2=new StringBuilder();
int num=mul_stack.removeLast();
for(int j=0;j<num;j++){
temp2.append(temp);
}
//字母都是一组一组被加入到stack_res中,stack_res.removeLast()是将在遇到[之后的字符或者字符串移出与现在的结果进行拼接
temp=new StringBuilder(stack_res.removeLast()+temp2);//将之前保存的结果与现在的结果拼接形成新的结果
}else if(str.charAt(i)=='|'){
//当碰到|时才表示数字已结束
mul_stack.add(multi);
multi=0;
}else if(str.charAt(i)>='0'&&str.charAt(i)<='9'){
multi=multi*10+Integer.parseInt(str.charAt(i)+"");
}else{
temp.append(str.charAt(i));
}
}
System.out.println(temp.toString());
}
}
2、逛街
小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
输出
3 3 5 4 4 4
说明
当小Q处于位置3时,他可以向前看到位置2,1处的楼,向后看到位置4,6处的楼,加上第3栋楼,共可看到5栋楼。当小Q处于位置4时,他可以向前看到位置3处的楼,向后看到位置5,6处的楼,加上第4栋楼,共可看到4栋楼。
解析:这个题本人的思路是,选定当前值,判断从当前值的左边和右边能够看到的楼数。但是超时了,代码如下:
import java.util.Scanner;
//超时
public class Main1 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n;
n=sc.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=sc.nextInt();
}
int[] res=new int[n];
for(int i=0;i<n;i++){
int left=i-1;
int right=i+1;
int num=1;
int leapl=0;
int leapr=0;
while(left>=0){
if(left==i-1){
num++</