m0_57934880
2021-05-16 19:31
采纳率: 100%
浏览 104

求oj代码:C语言字符串的问题(代码通过即采纳)

Problem 编程实现对一个只包含大写字母的字符串进行压缩和解压缩。 压缩规则是:假设某连续出现的同一字母的数量为n,则其在压缩字符串中为字母n。若n=1,则n必须省略,例如,AAAABCCCCCDDDD压缩为A4BC5D4。 解压缩规则是将压缩字符串还原,例如,A4BC5D4解压为AAAABCCCCCDDDD。 输入、处理结果中的每个字符串的长度都不会超过99。 字符串库函数可用列表: strlen() 注意:禁用STL。 input: 第一行:数字1或者2,前者代表进行压缩,后者代表进行解压。 第二行:一个符合对应要求的字符串。 output: 处理后的结果。 Samples: input: 1 AAAABCCCCCDDDD output: A4BC5D4 input: 2 A4BC5D4 output: AAAABCCCCCDDDD

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • 白驹_过隙 2021-05-16 21:12
    已采纳
    #include<stdio.h>
    #include <cstring>
    #define LENGTH 2000
    char a[LENGTH];
    void compress_string() {
    	int i,n=1,l,j;
        l=strlen(a);
        for(i=0;i<l;i++){
            if(a[i]==a[i+1]){
                n++;
                //printf("%d\n", i);
            }
            else{
                if(n>1)
                    printf("%c%d", a[i],n);
                else
                    printf("%c", a[i]);
                //printf("%d\n", i);
                n=1;
            }
    	}
    }
    void jieya_string() {
        int i,n,l,j;
        l=strlen(a);
        for(i=0;i<l;i++){
            if(a[i]>='0'&&a[i]<='9'){
                n=a[i]-'0';
                for(j=0;j<n-1;j++){
                    printf("%c", a[i-1]);
                }
            }
            else
                printf("%c", a[i]);
    	}
    }
    int main(void) {
    	int i,t=0;
        scanf("%d", &t);
    	scanf("%s", a);
    	
    	if(t==2)
            jieya_string();
        else
            compress_string();
    	return 0;
    }
    
    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • #include<stdio.h>
    #define LENGTH 2000
    char a[LENGTH];
    void compress_string() {
    	int i,n=1,l,j;
        l=strlen(a);
        for(i=0;i<l;i++){
            if(a[i]==a[i+1]){
                n++;
                //printf("%d\n", i);
            }
            else{
                if(n>1)
                    printf("%c%d", a[i],n);
                else
                    printf("%c", a[i]);
                //printf("%d\n", i);
                n=1;
            }
    	}
    }
    
    int main(void) {
    	int i,t=0;
    	scanf("%s", a);
    	for(i=0;a[i]!='\0';i++){
            if(a[i]>='0'&&a[i]<='9'){
                t=1;
                break;
            }
    	}
    	
           compress_string(a);
    
    	return 0;
    }
    
    评论
    解决 无用
    打赏 举报
  • qfl_sdu 2021-05-16 21:05

    代码如下,如有帮助,请采纳一下,谢谢。

    #include <stdio.h>
    #include <string>
    //字符串压缩
    char* StringPress(const char buf[])
    {
    	int len = strlen(buf);
    	char *p = new char[len+1];
    	memset(p,0,len+1);
    
    	int nmb = 1;
    	//p[0] = buf[0];
    	char c = buf[0];
    	int i = 0;
    	int indexp = 0;
    	bool br = true;
    	while(i < len)
    	{
    		if (buf[i] == c)
    		{
    			nmb++;
    			br = true;
    		}else
    		{
    			br = false;
    			if(nmb > 1)
    			{
    				p[indexp] = c;
    				indexp++;
    				p[indexp] = nmb + 48;
    				indexp++;
    			}else
    			{
    				p[indexp] = c;
    				indexp++;
    			}
    			c = buf[i];
    			//p[indexp] = c;
    			//indexp++;
    			nmb = 1;
    		}
    		i++;
    	}
    
    	if (br)
    	{
    		p[indexp] = c;
    		indexp++;
    		p[indexp] = nmb + 48;
    	}
    	
    	return p;
    }
    //字符串解压
    char* StringUnPress(const char buf[])
    {
    	int len = strlen(buf);
    	char* p = new char[100];
    	memset(p,0,100);
    	int index = 0;
    	int i = 0;
    	for (; i < len-2;)
    	{
    		char c = buf[i];
    		p[index] = c;
    		index++;
    		if (buf[i+1] >= 'A' && buf[i+1] <= 'Z')
    		{
    			//p[index] = buf[i+1];
    			//index++;
    			i+=1;
    		}else
    		{
    			char tmp[4] = {0};
    			tmp[0] = buf[i+1];
    			if(buf[i+2] >= '0' && buf[i+2] <= '9')
    			{
    				tmp[1] = buf[i+2];
    				int ds = atoi(tmp);
    				for (int k = 0; k < ds-1;k++)
    				{
    					p[index] = c;
    					index++;
    				}
    				i = i+3;
    			}else
    			{
    				int ds = atoi(tmp);
    				for (int k = 0; k < ds-1;k++)
    				{
    					p[index] = c;
    					index++;
    				}
    				i+=2;
    			}
    		}
    	}
    	//printf("-->%d,%d",i,len);
    	if (i == len -2)
    	{
    		p[index] = buf[i];
    		index++;
    		if (buf[len -1]>= 'A' && buf[len-1] <= 'Z')
    		{
    			p[index] = buf[len-1];
    		}else
    		{
    			char tmp[2] = {0};
    			tmp[0] = buf[len -1];
    			int ds = atoi(tmp);
    			for (int k = 0; k < ds -1;k++)
    			{
    				p[index] = buf[len -2];
    				index++;
    			}
    		}
    
    	}else if (i == len -1)
    	{
    		p[index] = buf[i];
    		index++;
    	}
    	return p;
    }
    
    int main()
    {
    	int i;
    	char buf[100]={0};
    	scanf("%d",&i);
    	scanf("%s",buf);
    
    	if (i == 1)
    	{
    		char* pp = StringPress(buf);
    		printf("%s\n",pp);
    		delete[] pp;
    		pp = 0;
    	}else if (i == 2)
    	{
    		char* pp = StringUnPress(buf);
    		printf("%s\n",pp);
    		delete[] pp;
    		pp = 0;
    	}
    
    	
    
    	getchar();
    	getchar();
    	return 0;
    }
    
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题