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();
}
}