题目描述:
文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如 ccccc 就用 5c 来表示。如果字符没有重复,就原样输出。例如 aba 压缩后仍然是 aba。
解压方法就是反过来,把形如 5c 这样的表示恢复为 ccccc。
本题需要你根据压缩或解压的要求,对给定字符串进行处理。这里我们简单地假设原始字符串是完全由英文字母和空格组成的非空字符串。
-
输入格式:
输入第一行给出一个字符,如果是 C 就表示下面的字符串需要被压缩;如果是 D 就表示下面的字符串需要被解压。第二行给出需要被压缩或解压的不超过 1000 个字符的字符串,以回车结尾。题目保证字符重复个数在整型范围内,且输出文件不超过 1MB。 -
输出格式:
根据要求压缩或解压字符串,并在一行中输出结果。
解题思路:这道题首先先用一个字符接收后判断是压缩还是解压,如果是压缩,for循环以字符遍历,字符相同index++否则就通过append方法将此字符接到结果字符串上。解压通用for循环遍历,但是不同的是如果接收到数字后要将对应的字符输出num遍
易错点:解压时要注意有的字符出现可能几十次几百次,这里也卡了好久,后面看别人代码num =num * 10 + (now - ‘0’)很nice的解决了这个问题
程序:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
char a = bf.readLine().charAt(0);
char[] b = bf.readLine().toCharArray();
StringBuilder output = new StringBuilder();
if (a=='C') {
char c = b[0];
int index = 1;
for (int i = 1; i < b.length; i++) {
char now = b[i];
if (now==c) {
index++;
if (i==b.length-1) {
output.append(index);
}
}else {
if (index!=1) {
output.append(index);
}
output.append(c);
c = now; //将下一个字符作为比较字符
index = 1; //更新该字符出现的次数
}
}
output.append(c);
System.out.println(output);
}
if (a=='D') {
int num = 0;
for (int i = 0; i < b.length; i++) {
char now = b[i];
//判断第i个字符是不是数字
if (now>='0'&&now<='9') {
num =num * 10 + (now - '0');//这行代码解决了如果数字不是一位数的问题
//num = Integer.parseInt(String.valueOf(now));
}else {
if (num==0) {
output.append(now);
}
for (int j = 0; j < num; j++) {
output.append(now);
}
num = 0;
}
}
System.out.println(output);
}
}
}