zoukankan      html  css  js  c++  java
  • ECNU 3135 数据压缩

    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();
          }
        }
    
      }
    
  • 相关阅读:
    用Python完成一个汇率转换器
    鸿蒙如何用JS开发智能手表App
    鸿蒙如何用JS开发智能手表App
    SAP Spartacus SplitViewComponent Migration 的一个具体例子
    SAP Spartacus B2B 页面 Popover Component 的条件显示逻辑
    SAP Spartacus 升级时关于 schematics 的更新
    SAP Spartacus B2B 页面 Disable 按钮的显示原理
    SAP Spartacus B2B 页面 Disable Confirmation 对话框的显示原理
    通过 Feature Level 动态控制 SAP Spartacus 的页面显示
    SAP Commerce Cloud Build Manifest Components
  • 原文地址:https://www.cnblogs.com/blogxjc/p/14382821.html
Copyright © 2011-2022 走看看