字符串压缩

隐约记得这道笔试题,之前在网上看到过一次,感觉应该能做出来,结果第一次尝试折腾了半天,弄有bug统计kkll这样的可以但是字符出现连续三次以上的这就不行了,第二天理了一次,用笔画了画,2分钟搞定了。总结:写程序必须先理清楚思路,再动手敲,不然。。。

为了发出来又百度了原题,原题要求用以各函数实现,第一次没有意识到,只在意结果,就没想着用函数,既然又要求,下次再补上。

原题是这样的:

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。 压缩规则:

1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz" 
要求实现函数: 
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr); 
【输入】 pInputStr:  输入字符串
         lInputLen:  输入字符串长度         
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长; 
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出 
示例 

输入:“cccddecc”   输出:“3c2de2c” 输入:“adef”     输出:“adef” 输入:“pppppppp” 输出:“8p。

这里是用循环做的,还不够完善,无法统计十五以上的次数,所以用加号(+)暂时代替。

#include<stdio.h>

int main(void){

	char str[1024] = {0};
	char *pwr = &str[0];
	char *p, *mark;
	int count = 1;
		printf("please input a string:\nbefore:");
		scanf("%s", str);
	for(p=&str[0];*p != '\0';p++){
	
		if(*p != *(p+1)){

			if(count > 1){
				pwr++;
				count = 1;
			}
			*pwr = *p;
			pwr++;
		}else{
			if(count == 1)mark = pwr;
			count++;
			*mark = count+48;
			if(*mark > 57)*mark = *mark+7;
			if(*mark > 70)*mark = '+';
		}
	
	}
	*pwr = '\0';
	
	printf("after:%s\n", str);
	return 0;
}

改写成题中函数接口的:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void stringZip(const char *pinputStr, long inputLen, char* pOutputStr){

	char *mark;
	char *p = pinputStr;
	int count = 1;
	int i;

	for(i=0;i<inputLen;i++, p++){
	
		if(*p != *(p+1)){

			if(count > 1){
				pOutputStr++;
				count = 1;
			}
			*pOutputStr = *p;
			pOutputStr++;
		}else{
			if(count == 1)mark = pOutputStr;
			count++;
			*mark = count+48;
			if(*mark > 57)*mark = *mark+7;
			if(*mark > 70)*mark = '+';
		}
	
	}
	*pOutputStr = '\0';
}


int main(void){

	char istr[1024];
        memset(istr,0,sizeof(istr));
        printf("please input a string:\n");
	scanf("%s", istr);
	const char* istr_temp = istr;
	char *ostr = (char*)malloc(strlen(istr));
	memset(ostr, 0, strlen(istr));

	stringZip(istr_temp, (long)strlen(istr), ostr);

	printf("after zip:%s\n", ostr);
	free(ostr);
	return 0;
}

const 保护istr_temp常量指针不被修改,编译时候第八行会报警告[initialization discards ‘const’ qualifier from pointer target type],到这里终于读懂原题的意思了,它说别用指针操作,用下标吧。不然给的inputlen参数是为什么?我好迟钝..再改为下标操作的:

void stringZip(const char *pinputStr, long inputLen, char* pOutputStr){

	char *mark;//记录重复字符出现的起始位置
	int count = 1;//字符的重复次数,默认为1
	int i;

	for(i=0;i<inputLen;i++){
	
		if(pinputStr[i] != pinputStr[i+1]){

			if(count > 1){
				pOutputStr++;
				count = 1;
			}
			*pOutputStr = pinputStr[i];
			pOutputStr++;
		}else{
			if(count == 1)mark = pOutputStr;
			count++;
			*mark = count+48;
			if(*mark > 57)*mark = *mark+7;
			if(*mark > 70)*mark = '+';
		}
	
	}
	*pOutputStr = '\0';
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值