【申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出。 联系邮箱:Mr_chenping@163.com】
题目:
字符串原地压缩,题目描述:"eeeeeaaaff" 压缩为"e5a3f2",请编程实现
题目分析:
1、原地压缩,意思是不开辟额外的空间
2、应该考虑单个字符不压缩,比如‘q’压缩过后还是‘q’,而不应该是‘q1’
3、压缩后某个字符个数是多位数,
算法实现:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *str_res(char *str)
{
char t;
char *begin = str;
char *end = str + strlen(str) - 1;
while(begin < end)
{
t = *begin;
*begin++ = *end;
*end-- = t;
}
return str;
}
char *int_to_str(int num)
{
char *str = calloc(1, 16);
char *s = str;
while(num)
{
*str++ = num%10 + '0';
num /= 10;
}
*str = '\0';
return str_res(s);
}
char *str_compress(char *str)
{
char tmp;
char *fast = str;
char *slow = str;
char *r = str;
int count = 0;
while(*fast != '\0')
{
tmp = *fast++;
while(*fast == tmp && *fast != '\0')
fast++;
*r++ = *(fast-1);
count = fast - slow;
if(count != 1)
{
char *st = int_to_str(count);
strcpy(r, st);
r = r + strlen(st);
free(st);
}
slow = fast;
}
*r = '\0';
return str;
}
int main(int argc, char *argv[])
{
printf("%s-------->", argv[1]);
printf("%s\n", str_compress(argv[1]));
return 0;
}