一次面试的字符串解析

P02.运营商日终数据核对

内容:

某系统负责行内移动通道与运营商短信网关的对接,系统每日会对当天的短消息发送情况进行日终对账处理,由于信息内容重复量大,双方约定对对账信息进行压缩处理。压缩方法是:对于连续的若干个相同的信息"S"会压缩为"[NS]"的形式(N是一个整数且 1≤N≤99),比如说信息串"ABCABCABCABC"就压缩为"[4ABC]"或者"[2[2ABC]]",类似于后面这种压缩之后再压缩的称为二重压缩。如果是“[2[2[2ABC]]]”则是三重的。假设你是消息服务管理平台的研发人员,请你对运营商返回的批量核对数据信息进行解压缩。
输入输出要求:
输入:一个压缩后的字符串
输出:一个解压缩后字符串

【示例】
输入:ABC[3OJ],自测输入格式:ABC[3OJ]
输出:ABCOJOJOJ

【注意】
(1)数据范围:解压后的字符串长度在 30000 以内,最多只有十重压缩。输入字符串保证只包含数字、大写字母、'['和']'。
(2)提示:同一信息中允许多组压缩,如"[2ABC]OJ[4CODE]"。

 

 

package com.lsl.tests;

/**
 * @author: lsl
 * @date: 2020/12/14
 */
public class MyTest {

    public static void main(String [] args){
        //第一种格式
        String sourceStr = "LSL2[MJX3[2asd]LYH]END";
        String targetStr = parseStr(sourceStr);
        System.err.println("targetStr=" + targetStr);

        //第二种格式
        String sourceStr1 = "ABC[2df]JK[3tp]BNM[2zx]";
        String targetStr1 = parseStr1(sourceStr1);
        System.out.println("targetStr1=" + targetStr1);
    }

    /**
     * 第二种格式解析
     * @param sourceStr
     * @return
     */
    public static String parseStr1(String sourceStr){
        StringBuffer targetSb = new StringBuffer();
        int firstKH = sourceStr.indexOf("[");//第一个【的位置
        int lastKH = sourceStr.indexOf("]");//第一个】的位置
        String result = sourceStr.substring(0,lastKH+1);

        if (result.contains("[")){
            String before = sourceStr.substring(0,firstKH);
            targetSb.append(before);
            String subString = sourceStr.substring(firstKH+1,lastKH);
            String num = subString.substring(0,1);
            String finshStr = appendStr(Integer.valueOf(num),subString.substring(1,subString.length()));
            targetSb.append(finshStr);

            //递归
            String after = sourceStr.substring(lastKH+1,sourceStr.length());
            String afterStr = parseStr1(after);
            targetSb.append(afterStr);
        }
        return targetSb.toString();
    }


    /**
     *  第一种格式解析【嵌套】
     * @param sourceStr
     * @return
     */
    public static String parseStr(String sourceStr){
        StringBuffer targetSb = new StringBuffer();
        int firstKH = sourceStr.indexOf("[");//第一个【位置
        int lastKH = sourceStr.lastIndexOf("]");//最后一个】位置

        //前缀部分
        String before = sourceStr.substring(0,firstKH);
        if (before.length()>1){
            targetSb.append(sourceStr.substring(0,firstKH-1));
        }

        //递归部分
        String result = sourceStr.substring(firstKH+1,lastKH);
        String num = sourceStr.substring(firstKH-1,firstKH);//循环次数
        String target = "";
        if (result.contains("[")){
            //递归调用
            target = parseStr(result);
            targetSb.append(appendStr(Integer.valueOf(num),target));
        }else {
            //最内层拼接
            String numInt = result.substring(0,1);
            String subString = result.substring(1,result.length());
            target = appendStr(Integer.valueOf(numInt),subString);
            targetSb.append(appendStr(Integer.valueOf(num),target));
        }

        //后缀部分
        String after = sourceStr.substring(lastKH+1,sourceStr.length());
        if (after.length()>0){
            targetSb.append(after);
        }

        return  targetSb.toString();
    }

    public static String appendStr(int len,String str){
        StringBuffer sb = new StringBuffer();
        for (int i=0;i<len;i++){
            sb.append(str);
        }
        return sb.toString();

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一路奔跑1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值