标签:接下来 需要 压缩 题目 表示 scan str next 数据
https://acm.ecnu.edu.cn/problem/3135
单点时限: 2.0 sec
内存限制: 256 MB
RLE (Run Length Encoding)算法是一个简单高效的无损数据压缩算法。
算法的基本思路 :
(1)、把数据看成一个线性序列;
(2)、用一个字节表示数据重复的次数,然后在这个字节后面存储对应的数据。
例如,数据序列 AAAAABBCD,采用 RLE 算法压缩为:5A2B1C1D。
(3)、由于只采用一个字节存储数据重复次数,其最大值为 255;因此对于数据序列的某一个数据重复次数大于 255 时,则当计数到 255 时就必须强制将计数值和当前数据值写入,然后再重新开始计数。
例如,数据序列:
采用 RLE 算法压缩为:255A7A5B2C1D1E3P
输入格式
第 1 行:一个整数 () 为问题数。
接下来 T 行,每行输入一段文本数据,文本长度不超过 500 个字符。
文本由可打印字符组成。
输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。然后对应每个问题 , 在一行中输出压缩后的结果。
样例
input
3
AAAAABBCD
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBCCDEPPP
fggggdfeir9999000;;dqqqq234ererrrrrrrrrrrrvvvvvvz
output
case #0:
5A2B1C1D
case #1:
255A7A5B2C1D1E3P
case #2:
1f4g1d1f1e1i1r49302;1d4q1213141e1r1e12r6v1z
问题不是很难,记录一个字符连续出现的次数,不同时输出,唯一需要考虑到的是连续255个字符,就要归零,这和最后直接输出不同,需要额外增加一个flag。
public static void fun() {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
String line = sc.next();
StringBuffer sb = new StringBuffer(line);
System.out.println("case #" + i + ":");
int count = 1;
int flag = 0;
char temp = sb.charAt(0);
for (int j = 1; j < sb.length(); j++) {
if (sb.charAt(j) == temp) {
count++;
if (count == 255) {
System.out.print(count + "" + temp);
if (j + 1 < sb.length()) {
temp = sb.charAt(j + 1);
count = 1;
j++;
} else {
flag = 1;
}
}
} else {
System.out.print(count + "" + temp);
count = 1;
temp = sb.charAt(j);
}
}
if (count > 0 && flag == 0) {
System.out.println(count + "" + temp);
} else {
System.out.println();
}
}
}
标签:接下来 需要 压缩 题目 表示 scan str next 数据
原文地址:https://www.cnblogs.com/blogxjc/p/14382821.html