6-2 字符串压缩

本文介绍了如何实现一个简单的字符串压缩函数zip,根据字符连续出现的次数将其转换为nx形式,适用于长度不超过20的字符数组。函数通过遍历字符串并计数连续字符来完成压缩。

本题要求实现一个字符串压缩的简单函数。压缩规则是:如果某个字符x连续出现n(n>1)次,则将这n个字符x替换为nx的形式;否则保持不变。

函数接口定义:

 

void zip( char *p );

函数zipp指向的字符串进行压缩操作。

代码:

#include <stdio.h>
#define MAXS 20

void zip(char *p)
{
    int m,j=0,count=1;
    int len=strlen(p);
    for(m=0;m<len;m++)
    {
        if(p[m]==p[m+1])
            count++;
        else{
        if(count==1)
        {
            p[j]=p[m];
            j++;
        }
        if(count>1&&count<10)
        {
            p[j]=count+48; //加上48后就是数字对应的字符型
            j++;
            p[j]=p[m];
            j++;
            count=1;
        }
        else if(count>9)
        {p[j]=(count/10)+48;
            j++;
        p[j]=(count%10)+48;
        j++;
        p[j]=p[m];
        j++;
        count=1;
        }
              }
   }
    p[j]='\0';
}

void ReadString( char *s ); /* 由裁判实现,略去不表 */

int main()
{
    char s[MAXS];
    
    ReadString(s);
    zip(s);
    printf("%s\n", s);
    
    return 0;
}

/* 请在这里填写答案 */

6-2 字符串压缩是一种数据压缩技术,用于减少字符串中的冗余信息。在给定的题目中,你需要编写一个名为`zip`的函数,接受一个指向字符数组的指针`p`作为输入。这个函数的目标是遍历整个字符串,并根据特定的压缩规则进行操作: 1. 当遇到第一个字符x时,记录它出现的次数(初始值为1)。 2. 遇到下一个相同的字符时,将当前计数加一。 3. 如果发现一个字符连续出现了n(n大于1)次,将其替换为"x"加上对应的数字'n'。例如,如果之前看到的是"A"连续出现了3次,就变成"3A"。 4. 如果遇到不同的字符,结束当前的计数,继续寻找新的字符进行计数。 5. 在遍历结束后,记得处理最后一个字符,因为它可能不是按规则重复的。 下面是一个简单的伪代码示例: ```cpp void zip(char* p) { int count = 1; char prev_char = p[0]; for (int i = 1; p[i] != '\0'; i++) { if (p[i] == prev_char) { count++; } else { // 如果字符改变了,检查是否需要压缩 if (count > 1) { p[i - 1] = prev_char; // 更新前一个字符 sprintf(p + i - 1, "%d", count); // 添加数字 } prev_char = p[i]; // 更新当前字符 count = 1; } } // 处理最后一个字符(可能需要单独压缩) if (count > 1) { p[strlen(p) - 1] = prev_char; sprintf(&p[strlen(p)], "%d", count); } } ``` 完成这个函数后,别忘了处理边界情况并测试一些例子,包括有重复字符、无重复字符以及字符串结尾的特殊情况。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值