腾讯2020笔试题

本文介绍了腾讯2020年笔试中出现的算法题目,包括字符串压缩解压、逛街问题、逆序对计算、假期规划和视野争夺问题。通过实例解析了如何使用栈、单调栈、归并排序等数据结构和算法解决这些问题。
摘要由CSDN通过智能技术生成

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++</
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值