(Good topic)压缩字符串 (3.16 leetcode每日打卡)

字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
 示例1:
 输入:"aabcccccaaa"
 输出:"a2b1c5a3"

 示例2:
 输入:"abbccd"
 输出:"abbccd"
 解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。

提示:
字符串长度在[0, 50000]范围内。
 
思路就是:遍历字符串,然后用cnt计数,然后写入另一个定义的字符串,最后比较长短即可
做这道题对我来是真的忐忑,做了两个小时,分享一下我遇到的大坑
1.首先int型转化为char型 需要整型+48然后强制类型转换
2.然后运行不对,原因就是没有初始化定义的压缩数组,于是全部初始为'0',要养成初始化数组的好习惯
3.结果仍然不对,上编译器调试,于是发现字符串末尾需要用'\0'截断,不然会出现乱码
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] = '\0';
44     return strlen(dealS) < strlen(S) ? dealS : S;
45 }

 

 
 
 
 
posted @ 2020-03-16 11:24  Xxaj5  阅读(311)  评论(0编辑  收藏  举报