字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
示例1:
输入:"aabcccccaaa"
输出:"a2b1c5a3"
输出:"a2b1c5a3"
示例2:
输入:"abbccd"
输出:"abbccd"
解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。
输出:"abbccd"
解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。
提示:
字符串长度在[0, 50000]范围内。
思路就是:遍历字符串,然后用cnt计数,然后写入另一个定义的字符串,最后比较长短即可
做这道题对我来是真的忐忑,做了两个小时,分享一下我遇到的大坑
1.首先int型转化为char型 需要整型+48然后强制类型转换
2.然后运行不对,原因就是没有初始化定义的压缩数组,于是全部初始为'0',要养成初始化数组的好习惯
3.结果仍然不对,上编译器调试,于是发现字符串末尾需要用' '截断,不然会出现乱码
4.然后个数小于十的通过了,依然不对,原因就是因为还有个数是多位数的,数字的长度不仅仅是小于10,想了好久该怎样把大于十的整型放入字符串,于是我用了itoa函数,没想到出现编译错误,上网上查了一下是因为itoa是window特有的,于是改为了sprintf函数
5.我想这下总该对了,错误,原因就是压缩后的字符串可能比50000还长,这个是一开始没有想到的,于是改成了500000
1.首先int型转化为char型 需要整型+48然后强制类型转换
2.然后运行不对,原因就是没有初始化定义的压缩数组,于是全部初始为'0',要养成初始化数组的好习惯
3.结果仍然不对,上编译器调试,于是发现字符串末尾需要用' '截断,不然会出现乱码
4.然后个数小于十的通过了,依然不对,原因就是因为还有个数是多位数的,数字的长度不仅仅是小于10,想了好久该怎样把大于十的整型放入字符串,于是我用了itoa函数,没想到出现编译错误,上网上查了一下是因为itoa是window特有的,于是改为了sprintf函数
5.我想这下总该对了,错误,原因就是压缩后的字符串可能比50000还长,这个是一开始没有想到的,于是改成了500000
代码:
1 char* compressString(char* S) 2 { 3 int i, len; 4 int cnt = 1; 5 int j = -1; 6 char dealS[500000]; 7 memset(dealS, '0', 500000); 8 9 char ch = S[0]; 10 for (i = 0; S[i]; i++); //测量长度 其实可以用strlen 11 len = i; 12 if (len == 1) 13 return S; 14 for (i = 1; i < len+1; i++) //len+1是为了防止还没等压缩就因为到了末尾而跳出遍历了了 15 { 16 if (ch == S[i]) 17 { 18 cnt++; 19 } 20 else 21 { 22 dealS[++j] = ch; 23 if (cnt < 10) //判断计数器大于还是小于0 24 { 25 dealS[++j] = (char)(cnt + 48); 26 } 27 else 28 { 29 char buffer[25]; 30 sprintf(buffer, "%d", cnt); 31 for (int k = 0; buffer[k]; k++) 32 { 33 dealS[++j] = buffer[k]; 34 } 35 } 36 37 ch = S[i]; 38 i--; 39 cnt = 0; 40 } 41 } 42 43 dealS[++j] = '