美文网首页
腾讯2020校园招聘-后台&综合-第一次笔试 第一题

腾讯2020校园招聘-后台&综合-第一次笔试 第一题

作者: 就这些吗 | 来源:发表于2020-01-25 03:40 被阅读0次

测试地址:https://www.nowcoder.com/questionTerminal/c27561e5b7e0441493adb9a54071888d

可以直接去里面看题和测试,题目描述就不写了,写下思路,具体在代码里已经注释的很清楚了,

问题:小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为m|S,例如字符串ABCABCABC将会被压缩为[3|ABC],现在小Q的同学收到了小Q发送过来的字符串,你能帮助他进行解压缩么?

image.png

思路:我这里是用了递归的方法,将压缩字符串递归进最里面的一层,由里面开始解压
HG[3|B[2|CA]]F−>HG[3|BCACA]F−>HGBCACABCACABCACAF,难点在于如何取到最里面的一层,这里通过[与]的一一对应,每次需要[,计数器就+1,每次遇到],计数器就-1,这样可以取到[对应的]中间的字符串了。如此递归下去就能取到不包含[]的字符串,那么就可以开始解压了。
ps:应该有更好的思路,别被我的思路限制了。

import java.util.Scanner;
 
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        System.out.println(tar(s));
    }
 
    // 递归方法
    public static String tar(String s) {
        // 递归结束的判断,说明全部解压完毕
        if (!s.contains("[") && !s.contains("|")) {
            return s;
        }
        // 形如2|cd的变成cdcd
        if (!s.contains("[") && s.contains("|")) {
            String x[] = s.split("\\|");
            int num = Integer.parseInt(x[0]);
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < num; i++)
                sb.append(x[1]);
            return sb.toString();
        }
        // 上面if都不执行,说明既有[又有|,说明没有递归到最里层
        char a[] = s.toCharArray();
        // 用来存储完全解压后的字符串
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < a.length; i++) {
            // 设置栅栏,使得"["与"]"的个数相同,比如HG[3|B[2|CA]]F,会取得[3|B[2|CA]]
            int latch = 0;
            if (a[i] == '[') {
                latch++;
                // 指针往前进一位,形如[3|B[2|CA]],需要得到3|B[2|CA],为了去掉最外面的括号
                i++;
                if (a[i] == ']') {
                    latch--;
                }
                // 用来存储部分解压的字符串,比如有字符串HG[3|B[2|CA]]F中的,这次while循环结束 s1会变成3|B[2|CA]
                // 这里再次进行'['的判断是存在[[]]的情况
                StringBuffer s1 = new StringBuffer();
                while (!(a[i] == ']' && latch == 0)) {
                    if (a[i] == '[') {
                        latch++;
                    }
                    if (a[i] == ']') {
                        latch--;
                        if (latch == 0) {
                            // 说明到了最外层的]了,不进行下面的appen,为了取出最外层的[]
                            continue;
                        }
 
                    }
                    s1.append(a[i]);
                    // 指针后移,再次进入while循环
                    i++;
 
                }
                // 如果有初始字符串HG[3|B[2|CA]]F,此时s1为3|B[2|CA],去除了一层括号,
                String s2 = tar(s1.toString());
                // 判断里面还有没有未解压的字符串,有就继续解压,会递归到最里面的2|CA,得到CACA,返回到s2=3|BCACA,再次进行解压
                while (s2.contains("|")) {
                    s2 = tar(s2);
                }
                // 将解压完毕的字符串字符串加到sb后面
                sb.append(s2);
            } else {
                // 如果没有进行压缩的字符串,直接加到末尾就行
                sb.append(a[i]);
 
            }
 
        }
        return sb.toString();
 
    }
}

相关文章

网友评论

      本文标题:腾讯2020校园招聘-后台&综合-第一次笔试 第一题

      本文链接:https://www.haomeiwen.com/subject/izxrthtx.html