zoukankan      html  css  js  c++  java
  • PAT 乙级 1078 字符串压缩与解压 (20)

    文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如 ccccc 就用 5c 来表示。如果字符没有重复,就原样输出。例如 aba 压缩后仍然是 aba。

    解压方法就是反过来,把形如 5c 这样的表示恢复为 ccccc。

    本题需要你根据压缩或解压的要求,对给定字符串进行处理。这里我们简单地假设原始字符串是完全由英文字母和空格组成的非空字符串。

    输入格式:

    输入第一行给出一个字符,如果是 C 就表示下面的字符串需要被压缩;如果是 D 就表示下面的字符串需要被解压。第二行给出需要被压缩或解压的不超过1000个字符的字符串,以回车结尾。题目保证字符重复个数在整型范围内,且输出文件不超过1MB。

    输出格式:

    根据要求压缩或解压字符串,并在一行中输出结果。

    输入样例 1:

    C
    TTTTThhiiiis isssss a   tesssst CAaaa as
    

    输出样例 1:

    5T2h4is i5s a3 te4st CA3a as
    

    输入样例 2:

    D
    5T2h4is i5s a3 te4st CA3a as10Z
    

    输出样例 2:

    TTTTThhiiiis isssss a   tesssst CAaaa asZZZZZZZZZZ

    本文需要注意的是aaa的情况,其他的基本能过

      1 // 1078.cpp : 定义控制台应用程序的入口点。
      2 //
      3 
      4 #include "stdafx.h"
      5 #include<iostream>
      6 #include<string>
      7 #include<cstdlib>
      8 #include<stack>
      9 
     10 using namespace std;
     11 
     12 //将字母的个数置于字符串中
     13 void get_num(int &num,string &str2,const string &str,int &i)
     14 {
     15     stack<int> s;
     16 
     17     if (num != 1)
     18     {
     19         while (num)//将数字分别压入栈中
     20         {
     21             s.push(num % 10);
     22             num /= 10;
     23         }
     24 
     25         while (!s.empty())
     26         {
     27             str2 += (char)(s.top() + 48);
     28             s.pop();
     29         }
     30 
     31     }
     32 
     33     str2.append(1, str[i - 1]);
     34     num = 1;
     35 }
     36 
     37 void Zip()
     38 {
     39     string str, str2;
     40     getline(cin, str);
     41     int size = str.size(), num = 1;
     42 
     43     for (int i = 1; i<size; ++i)
     44     {
     45         if (str[i] == str[i - 1])
     46         {
     47             num++;
     48 
     49             if (i == size - 1)
     50                 get_num(num,str2,str,i);
     51         }
     52         else
     53         {
     54             get_num(num, str2, str, i);
     55 
     56             if (i == size - 1)
     57                 str2.append(1, str[i]);
     58         }
     59     }
     60 
     61     cout << str2 << endl;
     62 }
     63 
     64 bool isdigit(char c)
     65 {
     66     if (c <= '9'&&c >= '0')
     67         return true;
     68     else
     69         return false;
     70 }
     71 
     72 void Unzip()
     73 {
     74     string str, str2;
     75     getline(cin, str);
     76     int size = str.size();
     77 
     78     for (int i = 0; i<size; ++i)
     79     {
     80         if (isdigit(str[i]))//如果为数字求得该数字
     81         {
     82             int num = 0, j;
     83             for (j = i; isdigit(str[j]); ++j)
     84             {
     85                 num *= 10;
     86                 num += str[j] - 48;
     87             }
     88 
     89             str2.append(num, str[j]);
     90             i = j;        //刷新i
     91         }
     92         else
     93             str2.append(1, str[i]);
     94     }
     95 
     96     cout << str2 << endl;
     97 }
     98 
     99 int main()
    100 {
    101     char ch = getchar();
    102     getchar();
    103 
    104     if (ch == 'C')
    105         Zip();
    106     else
    107         Unzip();
    108 
    109     return 0;
    110 }
  • 相关阅读:
    [Javascript Crocks] Apply a function in a Maybe context to Maybe inputs (curry & ap & liftA2)
    Error: 17053 LogWriter: Operating system error 21(The device is not ready.)
    PPS2013校园招聘笔试题
    RobotFrameWork(十一)AutoItLibrary测试库在win7(64bit)下安装及简单使用
    iOS 5 故事板入门(3)
    Eclipse代码字体、颜色美化,更改字体大小、颜色
    iOS 5 故事板入门(4)
    54. 如何在测试中触发服务器上运行的代理
    【PHP SDK for OpenStack/Rackspace APIs】身份验证
    JQuery总结
  • 原文地址:https://www.cnblogs.com/cdp1591652208/p/8191261.html
Copyright © 2011-2022 走看看