0
点赞
收藏
分享

微信扫一扫

试题 算法训练 P0804

悲催博士僧 2022-03-18 阅读 59

编写一个函数void strcompress(char *s),输入一个字符串(只包含小写字母和空格,且长度小于1000),然后采用如下的规则对该字符串当中的每一个字符进行压缩:
  (1) 如果该字符是空格,则保留该字符。
  (2) 如果该字符是第1次出现或第3次出现或第6次出现,则保留该字符。
  (3) 否则,删除该字符。
  例如,若用户输入occurrence,经过压缩后,字符c的第2次出现被删除,第1和第3次出现仍保留;字符r和e的第2次出现均被删除,因此最后的结果为:ocurenc。
  编写main函数测试该函数的正确性。

输入:
  occurrence

输出:
  ocurenc

做了一个简单的哈希表记录每个字母的出现情况,用与字符串等长的一个数组记录每个字符向左的偏移量(初值为0),如果当前字符不必删除,就为其赋值为当前偏移量;如果当前字符需要删除,则将偏移量设置为0(待着不动),并且将偏移量+1。最后字符串的原始长度减去偏移量的终值就是经处理的字符串长度,别忘了在后面补\0,这样可以方便地用printf进行输出。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
void strcompress(char *s){
	int data[200]={0},len=strlen(s),mv=0,*p=(int*)malloc(sizeof(int)*len);
	for(int i=0;i<len;i++){
		char c=s[i];
		if(c==' '||data[c]==0||data[c]==2||data[c]==5)p[i]=mv;
		else{
			p[i]=0;
			mv++;
		}
		data[c]++;
	}
	for(int i=0;i<len;i++){
		int m=p[i];
		s[i-m]=s[i];	
	}
	s[len-mv]='\0';
}
int main(void){
	char s[1001],x;int l=0;
	while((x=getchar())!='\n')s[l++]=x;s[l]='\0';
	strcompress(s);
	printf("%s",s);
	return 0;
}
举报

相关推荐

0 条评论