江宁区住房和城乡建设局网站专业的营销型网站制作
2026/2/14 5:51:27 网站建设 项目流程
江宁区住房和城乡建设局网站,专业的营销型网站制作,网站建设 落地页,网站建设步骤大全(新卷,200分)- 报文解压缩#xff08;Java JS Python#xff09;题目描述为了提升数据传输的效率#xff0c;会对传输的报文进行压缩处理。输入一个压缩后的报文#xff0c;请返回它解压后的原始报文。压缩规则#xff1a;n[str]#xff0c;表示方括号内部的…(新卷,200分)- 报文解压缩Java JS Python题目描述为了提升数据传输的效率会对传输的报文进行压缩处理。输入一个压缩后的报文请返回它解压后的原始报文。压缩规则n[str]表示方括号内部的 str 正好重复 n 次。注意 n 为正整数0 n 100str只包含小写英文字母不考虑异常情况。输入描述输入压缩后的报文1不考虑无效的输入报文没有额外的空格方括号总是符合格式要求的2原始报文不包含数字所有的数字只表示重复的次数 n 例如不会出现像 5b 或 3[8] 的输入输出描述解压后的原始报文注原始报文长度不会超过1000不考虑异常的情况用例输入3[k]2[mn]输出kkkmnmn说明k 重复3次mn 重复2次最终得到 kkkmnmn输入3[m2[c]]输出mccmccmcc说明m2[c] 解压缩后为 mcc重复三次为 mccmccmcc题目解析本题可以使用栈结构解题。思路也比较简单明了。我们只需要统计出如下几个关键信息即可要被重复的子串可以分解记录子串两边的[]的位置要被重复的子串的重复次数定义一个栈stack然后开始遍历输入字符串str的每一个字符c如果 c [则可以统计到两个信息要被重复的子串的起始位置根据题目描述[的前面必然是重复次数因此[可以作为重复次数结束统计的标志如果 c ]则可以得到要被重复的子串的结束位置此时我们可以进行生成解压串来替换掉对应范围的压缩串如果 c 是数字则必然是重复次数的组成此时可以记录下来当遇到’[‘时可以得到一个重复次数如果 c 是其他字符则压入栈中。JavaScript算法源码/* JavaScript Node ACM模式 控制台输入获取 */ const readline require(readline); const rl readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.on(line, (line) { console.log(getResult(line)); }); /* 算法逻辑 */ function getResult(str) { const stack []; // idxs记录要被重复的子串的起始位置 const idxs []; // nums记录要被重复的子串的重复次数和idxs对应 const nums []; // tmpRepeatCount记录正在拼接的重复次数字符串 const tmpRepeatCount []; // 遍历输入的字符串, c是当前正在遍历的字符 for (let c of str) { if (c [) { // 此时tmpRepeatCount已记录完当前重复子串对应的重复次数的所有字符 const repeatCount Number(tmpRepeatCount.join()); nums.push(repeatCount); tmpRepeatCount.length 0; // 记录要被重复的子串的起始位置 idxs.push(stack.length); } else if (c ]) { // 需要被重复的子串在栈中的起始位置 const start idxs.pop(); // 需要被重复的次数 const repeatCount nums.pop(); // 需要被重复的子串 const repeatStr stack.splice(start).join(); // 将新串压入栈中 stack.push(new Array(repeatCount).fill(repeatStr).join()); } else if (c 0 c 9) { tmpRepeatCount.push(c); } else { stack.push(c); } } return stack.join(); }Java算法源码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.nextLine(); System.out.println(getResult(str)); } public static String getResult(String str) { // Java可以使用StringBuilder模拟栈 StringBuilder sb new StringBuilder(); // idxs记录要被重复的子串的起始位置 LinkedListInteger idxs new LinkedList(); // nums记录要被重复的子串的重复次数和idxs对应 LinkedListInteger nums new LinkedList(); // tmpRepeatCount记录重复次数的的字符组成 StringBuilder tmpRepeatCount new StringBuilder(); // 遍历输入的字符串 for (int i 0; i str.length(); i) { // c是当前正在遍历的字符 char c str.charAt(i); if (c [) { // 此时tmpRepeatCount已记录完当前重复子串对应的重复次数的所有字符 int repeatCount Integer.parseInt(tmpRepeatCount.toString()); nums.add(repeatCount); tmpRepeatCount new StringBuilder(); // 记录要被重复的子串的起始位置 idxs.add(sb.length()); } else if (c ]) { // 需要被重复的子串在栈中的起始位置 int start idxs.removeLast(); // 需要被重复的次数 int repeatCount nums.removeLast(); // 需要被重复的子串 String repeatStr sb.substring(start); // 重复后的新串 StringBuilder tmp new StringBuilder(); for (int j 0; j repeatCount; j) tmp.append(repeatStr); // 替换对应子串为重复后的新串 sb.replace(start, sb.length(), tmp.toString()); } else if (c 0 c 9) { tmpRepeatCount.append(c); } else { sb.append(c); } } return sb.toString(); } }Python算法源码# 输入获取 s input() # 算法入口 def getResult(s): stack [] # idxs记录要被重复的子串的起始位置 idxs [] # nums记录要被重复的子串的重复次数和idxs对应 nums [] # tmpRepeatCount记录重复次数的的字符组成 tmpRepeatCount [] # 遍历输入的字符串c是当前正在遍历的字符 for c in s: if c [: # 此时tmpRepeatCount已记录完当前重复子串对应的重复次数的所有字符 repeatCount int(.join(tmpRepeatCount)) nums.append(repeatCount) tmpRepeatCount [] # 记录要被重复的子串的起始位置 idxs.append(len(stack)) elif c ]: # 需要被重复的子串在栈中的起始位置 start idxs.pop() # 需要被重复的次数 repeatCount nums.pop() # 需要被重复的子串 repeatStr .join(stack[start:]) # 先删除要被替换的子串然后加入新串即重复对应次数的子串 stack stack[:start] stack.append(.join([repeatStr] * repeatCount)) elif 0 c 9: tmpRepeatCount.append(c) else: stack.append(c) return .join(stack) # 算法调用 print(getResult(s))

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询