这个题用C我是一个一个字符处理的
有几个需要注意的点
- 不管压缩还是解压,注意第一行输入的'\n'输入一定要处理,我是用了一个字符去存储(之后这个字符被清零了,用作接下来的数据的处理,重复利用)
当需要压缩时
我是记录当前字符和上一个字符,当上一个字符和当前字符不同时,则输出压缩后的字符
- 当字符数为1时不要输出1
- 注意首个字符的处理,此时上一个字符尚未初始化,要特殊处理
当需要解压时
- 也需要注意字符数为1的情况
C/C++
1 #include <iostream> 2 #include <string> 3 #include <stdlib.h> 4 #include <cmath> 5 6 using namespace std; 7 8 int main() { 9 char s, last, c; 10 int num = 0; 11 string sum = "0"; //一定要初始化,否则测试点2会有运行时错误 12 c = getchar(); 13 last = getchar(); //用于接收第一行输入结尾的空格 14 last = NULL; 15 if(c == 'C') { 16 while (last != '\n') { //回车换行时结束 17 s = getchar(); 18 if (s != last && last != NULL) { //字母变换时则输出(排除last还没值时的输入) 19 if (num == 1) cout << last; 20 else cout << num << last; 21 num = 0; 22 } 23 num++; 24 last = s; 25 } 26 } else if (c == 'D') { 27 while (last != '\n') { 28 s = getchar(); 29 if (!(s >= '0' && s <= '9')) { //若输入不为数字,此时输出字符 30 for (int i = 0; i < stoi(sum); ++i) { 31 cout << s; 32 } 33 if (sum == "0") cout << s; //处理只有一个字符的情况 34 sum = "0"; 35 num = 0; 36 } else if (s >= '0' && s <= '9') { //用字符串相加来处理输出字母个数大于10的情况 37 sum += s; 38 num++; 39 } 40 last = s; 41 } 42 } 43 return 0; 44 }