poj 1782 Run Length Encoding
2015-01-17 11:47
381 查看
这道题目不难,但是有很多细节是需要注意的
1.读入一个带有空格的字符串string,可以采用string类中的getline方法
2.这道题目理解起来有些问题,这里做一些解释:理解题目出了问题 走了很多弯路!!!
run length encoding 变长编码,
要求 2- 9 个相同字符转化为 count + X 形式表示,
同时提取最大子串 前后加上1,亦即 1 str 1如果子串中含有1 需要 额外增加一个 1
3.最后一段子串的处理,以为这时没有后续字符了,操作时候有些问题,调了很久,特别是字符串末尾的那个1,
4.这个是测试数据http://download.csdn.net/detail/zhyh1435589631/8370537
5. 通过与官方给出的源代码比较后发现,自己想的太过复杂
Source Code
Source Code
这时官方给出的源代码:
1.读入一个带有空格的字符串string,可以采用string类中的getline方法
2.这道题目理解起来有些问题,这里做一些解释:理解题目出了问题 走了很多弯路!!!
run length encoding 变长编码,
要求 2- 9 个相同字符转化为 count + X 形式表示,
同时提取最大子串 前后加上1,亦即 1 str 1如果子串中含有1 需要 额外增加一个 1
3.最后一段子串的处理,以为这时没有后续字符了,操作时候有些问题,调了很久,特别是字符串末尾的那个1,
4.这个是测试数据http://download.csdn.net/detail/zhyh1435589631/8370537
5. 通过与官方给出的源代码比较后发现,自己想的太过复杂
Source Code
Problem: 1782 | User: zhyh2010 | |
Memory: 228K | Time: 16MS | |
Language: C++ | Result: Accepted |
#include <iostream> #include <string> using namespace std; void max_length_handle(int & diff_count,char * diff_temp) { if (diff_count > 1) { cout << 1; for (int jj = 0; jj != diff_count - 1; ++jj) { cout << diff_temp[jj]; } cout << 1; diff_count = 0; } } int main(int argc, char ** argv) { string input; char temp; int count; char * diff_temp = new char[1000]; int diff_count; while (getline(cin,input)) { // initialize temp = input[0]; count = 1; diff_count = 1; diff_temp[0] = temp; // main body for (int ii = 1; ii != input.length() + 1; ++ii) { // 数据全部处理完 if (ii == input.length()) { if (count > 1) { // 最大相同输出 cout << count << temp; diff_count = 0; } else { // 最大序列输出 // 使用++ 处理最后单个字符 // **************若最后单个数字为 1 时候!!!!********** if (input[ii - 1] == '1') { diff_temp[diff_count] = '1'; ++diff_count; } max_length_handle(++diff_count, diff_temp); } // 跳出 break; } // 逐步处理数据 if (temp == input[ii]) { // 前后相同字符处理 // 最大9个一起处理 if (count == 9) { cout << count << temp; temp = input[ii]; count = 0; } // 得到最大序列ABCDEE AA max_length_handle(diff_count, diff_temp); // body ++count; } else { // 前后不同字符处理 // 前面的字符已经可以输出时 AAAB ==> 3A if (count > 1) { cout << count << temp; diff_count = 0; temp = '\0'; // attention!!! 注意 1 操作 } // 序列中有1时候的处理 if (temp == '1') { diff_temp[diff_count] = '1'; ++diff_count; } // 将不同的字符加入 diff_temp 序列中去 diff_temp[diff_count] = input[ii]; ++diff_count; count = 1; temp = input[ii]; } } cout << endl; } return 0; }
这时官方给出的源代码:
// Problem Run Length Encoding // Algorithm Straight-Forward // Runtime O(n) // Author Walter Guttmann // Date 2003.12.07 #include <fstream> #include <iostream> #include <string> using namespace std; ifstream in("encoding.in"); int main() { string line; while (getline(in, line)) { for (string::iterator it = line.begin() ; it != line.end() ; ) { int rep = 1; while (rep < 9 && (it+rep) != line.end() && *it == *(it+rep)) ++rep; // A sequence of min(rep,9) identical characters starts at *it. if (rep > 1) { cout << rep << *it; it += rep; } else { cout << 1; for ( ; it != line.end() && ((it+1) == line.end() || *it != *(it+1)) ; ++it) { cout << *it; if (*it == '1') cout << *it; } // Either a repetitive sequence begins at *it, or it reached the end of line. cout << 1; } } cout << endl; } return 0; }
相关文章推荐
- POJ1782:Run Length Encoding
- POJ 1782/ ZOJ 2240 : Run Length Encoding - 字符串处理(模拟)
- (字符串的模式模式匹配4.7.9)POJ 1782 Run Length Encoding(具有重复字符的字符串的处理方式)
- POJ-1782 Run Length Encoding-相同字符个数
- poj 1782 Run Length Encoding 自动机处理字符串
- POJ 1782 Run Length Encoding
- POJ 1782 Run Length Encoding 笔记
- Run-Length Encoding
- 【FOJ 1360】 Run Length Encoding
- SDUT 2352 Run Length Encoding
- [转]行程编码(Run Length Encoding)和算术编码
- HOJ 1670 Run Length Encoding
- P13 (**) Run-length encoding of a list (direct solution).
- ZOJ-2240 Run Length Encoding
- Run Length Encoding
- ZOJ 2240. Run Length Encoding
- 行程长度压缩算法(Run Length Encoding)
- 2018_1_30_Run Length Encoding_string_STL_模拟
- Run-Length Encoding
- 1639. Run Length Encoding