昨天参加WPS的笔试时,有一道题是要求写一个函数实现字符串压缩,举个例子:

输入:aaabbccccc

输出:a3b2c5

当时总想着怎么把输入的字符串str改写成输出那压缩形式,如果要修改字符串的话需要考虑的问题比较多:

定义一个int count对重复的字符进行计数,结束重复时要如何将这个count转换成char类型加入字符串?个位数的重复比较简单,如果一个字符的重复是十位数百位数千位数呢?

是要重新定义一个字符串还是在原字符串修改呢?如果是重新定义字符串还要考虑该局部函数在结束的时候数组也会跟着被销毁的问题。如果是在原字符串修改的话在处理无连续重复的字符时也需要谨慎处理。


总之,要考虑的问题如此之多,在这么短的笔试时间内,这种费时费力的思路应该早早放弃才对,而昨天就是对以上的问题进行死磕,导致时间不够用,结果很不理想。


接下来是另一种思路,简单粗暴!题目要求只是一个输出,那就直接边计数边printf输出好了,完全抛弃对字符串做修改或者新建一个字符串的老路。

这样的话代码就变得十分简短了:

#include <stdio.h>
#define N 100

void compress(char str[]);

void main(void){
	char str[N];

	printf("Enter a string:\n");
	scanf("%Ns", str);
	compress(str);
}

void compress(char str[]){
	int i = 0, cnt = 1;
	
	while(str[i] != '\0'){
		if(str[i+1] == str[i])
			cnt++;
		else{
			printf("%c%d", str[i], cnt);
			cnt = 1;
		}
		i++;
	}
	printf("\n");
}


测试如下:

wKioL1Q7MtqyHU2qAAB1UdOVVZk336.jpg

这样或许达不到在内存中的压缩效果,反正题目中没要求,或许出题的意图也只是想要视觉上的压缩效果而已。