本题要求实现一个字符串压缩的简单函数。压缩规则是:如果某个字符x
连续出现n
(n>1)次,则将这n
个字符x
替换为nx
的形式;否则保持不变。
函数接口定义:
void zip( char *p );
函数zip
对p
指向的字符串进行压缩操作。
裁判测试程序样例:
#include <stdio.h>
#define MAXS 20
void zip( char *p );
void ReadString( char *s ); /* 由裁判实现,略去不表 */
int main()
{
char s[MAXS];
ReadString(s);
zip(s);
printf("%s\n", s);
return 0;
}
/* 请在这里填写答案 */
输入样例:
Mississippi
结尾无空行
输出样例:
Mi2si2si2pi
结尾无空行
void zip( char *p ){
int len = 0,i,count = 1,j = 0;
int x,count1;
char result;
while (p[len] != '\0'){ //求字符串长度
len++;
}
for (i = 0;i < len;i++){
result = p[i];
if (p[i] == p[i + 1]){ //寻找相等字符串
count++; //count统计相等字符串数量
}else if(p[i] != p[i + 1]&&count == 1){ //如果接下来字符串不一样则将count置一
p[j++] = p[i]; //p[j]用来储存转换后的字符串
count = 1; //数量置一
}else if(p[i] != p[i + 1]&&count > 1&&count <= 9){
p[j++] = count + '0'; //统计数量在前 在之后加‘0 ’是因为char相加的原因
p[j++] = result; //统计字符串在后 因为是ASCII相加,‘0 ’就等于ASCII的48
count = 1; //所以式子就可以等价为count + 48
}else if(p[i] != p[i + 1]&&count >= 10){ //如果重复超过10要另外考虑
count1 = count % 10; // 个位数
count = count / 10; // 十位数
p[j++] = count + '0';
p[j++] = count1 + '0';
p[j++] = result;
count = 1;
}
}
p[j] = '\0'; //补全p[j]字符串
}