码迷,mamicode.com
首页 > 其他好文 > 详细

ECNU 3135 数据压缩

时间:2021-02-08 11:56:48      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:接下来   需要   压缩   题目   表示   scan   str   next   数据   

ECNU 3135 数据压缩

链接

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

  }

ECNU 3135 数据压缩

标签:接下来   需要   压缩   题目   表示   scan   str   next   数据   

原文地址:https://www.cnblogs.com/blogxjc/p/14382821.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!