华为OD机试-简单的解压缩算法-2022Q4 A卷-Py/Java/JS
Posted 庭一
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为OD机试-简单的解压缩算法-2022Q4 A卷-Py/Java/JS相关的知识,希望对你有一定的参考价值。
现需要实现一种算法,能将一组压缩字符串还原成原始字符串,还原规则如下:
1、字符后面加数字N,表示重复字符N次。例如:压缩内容为A3,表示原始字符串为AAA。
2、花括号中的字符串加数字N,表示花括号中的字符重复N次。例如压缩内容为AB3,表示原始字符串为ABABAB。
3、字符加N和花括号后面加N,支持任意的嵌套,包括互相嵌套,例如:压缩内容可以A3B1C33
输入描述:
输入一行压缩后的字符串
输出描述:
输出压缩前的字符串
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
A3B1C33
输出
AAABCCCAAABCCCAAABCCC
说明
A3B1C33代表A字符重复3次,B字符重复1次,花括号中的C字符重复3次,最外层花括号中的AAABCCC重复3次。
Java 代码
import java.util.Scanner;
import java.util.*;
import java.util.stream.Collectors;
class Main
public static void main(String[] args)
// 处理输入
Scanner in = new Scanner(System.in);
//防止最后一个字符是数字
String str = in.nextLine();
Stack<String> stack = new Stack<>();
for (int i = 0; i < str.length(); i++)
char c = str.charAt(i);
if (c=='')
stack.push("");
else if (c=='')
if (Character.isDigit(str.charAt(i+1)))
int p = i+1;
while (p<str.length() && Character.isDigit(str.charAt(p))) p++;
int num = Integer.parseInt(str.substring(i+1,p));
StringBuilder sb = new StringBuilder();
while (!stack.peek().equals(""))
String s = stack.pop();
sb.append(s);
stack.pop();
stack.push(repeat(sb.toString(), num));
i = p-1;
else if (Character.isAlphabetic(c))
if (Character.isDigit(str.charAt(i+1)))
int p = i+1;
while (p<str.length() && Character.isDigit(str.charAt(p))) p++;
int num = Integer.parseInt(str.substring(i+1,p));
stack.push(repeat(c+"",num));
i = p-1;
else
stack.push(c+"");
StringBuilder sb = new StringBuilder();
while (!stack.isEmpty())
sb.append(stack.pop());
String str0 = sb.toString();
sb = new StringBuilder();
for (int i = str0.length()-1; i >=0 ; i--)
sb.append(str0.charAt(i));
System.out.println(sb.toString());
public static String repeat(String str, int num)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < num; i++)
sb.append(str);
return sb.toString();
Python代码
import functools
import collections
import math
def repeat_operation(stack,pos,repeat_count):
count = len(stack) - pos
# temp_stack用于存储弹栈数据
temp_stack = [0 for x in range(count)]
while (count >= 1):
count -= 1
temp_stack[count] = stack.pop()
temp_str = "".join(temp_stack)
result = ""
#重复repeat_count次
for i in range(repeat_count):
result += temp_str
stack.append(result);
#处理输入
input_str = input() + " "
stack = []
# bracket_pos 保存的是所有花括号出现的位置
bracket_pos = []
number_str = ""
for i in range(len(input_str)):
c = input_str[i]
if (c >= '0' and c <= '9'):
number_str += c
continue
#数字
if (len(number_str)>0):
repeat_count = int(number_str)
number_str = ""
# 若此时栈顶是 字符, 将对应的字母重复repeat_count次
if (stack[-1] == ""):
#获取上一个的位置
pos = bracket_pos.pop()
#删除左右
stack.pop(pos)
stack.pop()
# 重复之间的字母
repeat_operation(stack, pos, repeat_count)
else:
#不是 字符, 简单重复栈顶字符对应次即可
repeat_operation(stack, len(stack) - 1, repeat_count)
# 字符
if (c == ''):
bracket_pos.append(len(stack))
# 其他字符 (字母 + )
stack.append(c + "")
# 输出
print("".join(stack))
JS代码
function main(input_str)
input_str += " ";
let normal_chars = new Array()
let bracket_pos = new Array()
let numbers = new Array()
for (let i=0;i<input_str.length;i++)
//是否为数字
if (/\\d/.test(input_str[i]))
numbers.push(input_str[i]);
continue;
// 若当前字符不是数字,且数字数组长度大于0
if (numbers.length > 0)
let real_count = parseInt(numbers.join(""));
let top = normal_chars.pop()
if (top === "")
let inside_str = normal_chars.splice(bracket_pos.pop()).slice(1).join("");
normal_chars.push(...new Array(real_count).fill(inside_str).join(""));
else
normal_chars.push(...new Array(real_count).fill(top));
numbers = []
// 左花括号
if (input_str[i] === "")
bracket_pos.push(normal_chars.length);
// 正常字符
normal_chars.push(input_str[i]);
console.log(normal_chars.join("").trim())
main("A3B1C33")
华为OD机试真题 C++ 实现简单的解压缩算法2023 Q1 | 200分
目录
题目
题目描述:
现需要实现一种算法,能将一组压缩字符串还原成原始字符串,还原
以上是关于华为OD机试-简单的解压缩算法-2022Q4 A卷-Py/Java/JS的主要内容,如果未能解决你的问题,请参考以下文章
华为OD机试真题 Python 实现简单的解压缩算法2023 Q1 | 200分
华为OD机试真题 Java 实现简单的解压缩算法2023 Q1 | 200分
华为OD机试真题 JS 实现简单的解压缩算法2023 Q1 | 200分
华为OD机试真题 JS 实现任务调度2022.11 Q4 新题