问题描述:
有一种简单的字符串压缩算法,对于字符串中连续出现的同一个英文字符,用该字符加上连续出现的次数来表示(连续出现次数小于3时不压缩)。
例如,字符串aaaaabbbabaaaaaaaaaaaaabbbb可压缩为a5b3aba13b4。
请设计一个程序,采用该压缩方法对字符串压缩并输出。请编写一个函数compress,采用该压缩方法对字符串src进行压缩。函数定义如下:
char *compress(char *src);
返回值:
指向压缩后的字符串数据
参数:
src:输入/输出参数,输入表示待压缩字符串,输出表示压缩后的字符串
注意:函数声明已包含在主程序中,不需要自己定义。只需要提交自定义的函数代码。
主程序如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *compress(char *src);
int main()
{
char src[100];
scanf("%s",src);
char *ps = compress(src);
puts(ps);
return 0;
}
主函数输入说明:
输入第一行为源字符串src(长度小于100),该字符串只包含大小写字母。
主函数输出说明:
输出一个数据,表示压缩后的字符串。
主函数输入样例:
aaaaabbbabaaaaaaaaaaaaabbbb
主函数输出样例:
a5b3aba13b4
解答
正解
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *compress(char *src);
int main()
{
char src[100];
scanf("%s",src);
char *ps = compress(src);
puts(ps);
return 0;
}
char *compress(char *src)
{
int i, j, k = 0, len, ten;//len用来统计长度。
for (i = 0; src[i]; i++)//遍历字符串
{
len = 1;
for (j = i; src[j+1]; j++)//从i开始,判断是否相同
{
if (src[j] != src[j+1])
break;
else
len++;
}
if (len < 3)
{
for (;i <= j; i++)//将len<3的字符片段完整地挪到最新位置
src[k++] = src[i];
i--;//保证i=j;
}
else
{
src[k++] = src[i];
if (len < 10)
src[k++] = len + '0';
else
{
ten = len /10;
src[k++] = ten + '0';
src[k++] = len %10 + '0';
}
i = j;
}
}
src[k] = '\0';
return src;
}
错解
char *compress(char *src)
{
int i, j, k = 0, len, count, digit, num;//digit,num用来将计算的相同字符长度转换为字符;len用来统计长度。
for (i = 0; src[i]; i++)//遍历字符串
{
len = 1;
for (j = i; src[j+1]; j++)//从i开始,判断是否相同
{
if (src[j] != src[j+1])
break;
else
len++;
}
if (len < 3)
{
for (;i <= j; i++)//将len<3的字符片段完整地挪到最新位置
src[k++] = src[i];
i--;//保证i=j;
}
else
{
digit = 1, num = len;
while (num > 9)
{
num /= 10;
digit *= 10;
}
src[k++] = src[i];
while (len > 0)
{
src[k++] = len/digit + '0';
len %= digit;
digit /= 10;
}
i = j;
}
}
src[k] = '\0';
return src;
}
错解与正解的唯一区别便是在处理连续次数时使用的方法不同,由于本人水平有限,无法找出问题,希望哪位路过的大佬能够指点一番。当然,如果有其他问题的话,望指出。