|
|
发表于 2023-7-22 11:11:42
|
显示全部楼层
题目的要求是编写一个压缩字符串的功能,我们需要在需要添加的部分生成一个以 "m*x" 格式的字符串,表示连续的字符及其出现的次数。
在提供的代码中,我们已经得到了连续字符的首尾位置以及出现次数(m). 于是我们可以遵循以下步骤:
1、如果 m(出现的次数)大于1,则我们需要进行压缩。
2、因为新添加的串可能会增加总的字符数目,我们创建一个临时的数组来存储新生成的压缩字符串。
3、在临时数组中添加字符 m 和 '*'。
4、转换字符数 m 为字符串,并添加到临时数组。
5、然后,把原来字符串中在位置 k 之后的部分复制到新的位置。这部分仍需要保持原始的顺序。
6、在临时数组的最后添加 '\0' 来表示字符串结束。
这部分的代码将会这样的:
- if(m > 1){
- char temp[100];
- j = 0;
- while(j<i){
- temp[j]=t[j];
- j++;
- }
- temp[j++]=t[i];
- temp[j++]='*';
- sprintf(temp+j, "%d", m);
- j += strlen(temp+j);
- strcpy(temp+j, t+k);
- strcpy(t, temp);
- n = strlen(t);
- }
- i=k;
复制代码
所以完整的程序应当如下:
- #include<stdio.h>
- #include<string.h>
- void fun(char t[], int n){
- int i, k, m, j;
- i = 0;
- while(i < n-1){
- k = i + 1;
- while(t[k] == t[i])
- k++;
- m = k - i;
- if(m > 1){
- char temp[100];
- j = 0;
- while(j<i){
- temp[j]=t[j];
- j++;
- }
- temp[j++]=t[i];
- temp[j++]='*';
- sprintf(temp+j, "%d", m);
- j += strlen(temp+j);
- strcpy(temp+j, t+k);
- strcpy(t, temp);
- n = strlen(t);
- }
- i=k;
- }
- }
- int main(){
- char s[100] = "cccaeeeeebkkkkd";
- int n;
- n = strlen(s);
- printf("压缩前的数据:");
- puts(s);
- fun(s, n);
- printf("压缩后的数据:");
- puts(s);
- return 0;
- }
复制代码
这个程序会将 "cccaeeeeebkkkkd" 转换为 "c3a5b*4d"。 |
|