字符串压缩(C语言)

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

函数接口定义:

void zip( char *p )

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

裁判测试程序样例:

 
  
#include 
#define MAXS 20

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

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

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

输入样例:

Mississippi

输出样例:

Mi2si2si2pi

#include
void zip(char* p)
{
    int cout = 1;
    int j = 0, m;
    int len = strlen(p);
    for (m = 0; m < len; m++)
    {
        if (p[m] == p[m + 1])
            cout++;
        else if (p[m] != p[m + 1])
        {
            if (cout == 1)
            {
                p[j] = p[m];
                j++;
                cout = 1;
            }
            else if (cout > 1 && cout <= 9)
            {
                p[j] = cout + 48;
                j++;
                p[j] = p[m];
                j++;
                cout = 1;
            }
            else if (cout >= 10)
            {
                p[j] = (cout / 10) + 48;
                j++;
                p[j] = (cout % 10) + 48;
                j++;
                p[j] = p[m];
                j++;
                cout = 1;
            }

        }
    }
    p[j] = '\0';
}

它的出现次数。

首先,代码中使用了变量 `cout` 记录当前字符出现的次数,变量 `j` 用于记录压缩后的字符串的位置。`len` 是字符串 `p` 的长度。

然后,使用 `for` 循环遍历字符串 `p` 中的字符。对于当前字符 `p[m]`,代码判断它与下一个字符 `p[m+1]` 是否相同:

- 如果当前字符和下一个字符相同,说明字符连续出现,将计数器 `cout` 自增。
- 如果当前字符和下一个字符不同,说明字符不再连续出现,根据不同的情况进行处理:

  - 如果 `cout` 的值为 1,表示当前字符只出现了一次,直接将当前字符保存到压缩后的字符串 `p` 的位置 `j`,然后 `j` 自增。

  - 如果 `cout` 的值大于 1 且小于等于 9,表示当前字符出现了 2 到 9 次,首先将 `cout` 的值加上字符 `'0'` 得到对应的数字字符,然后依次将该数字字符和当前字符保存到压缩后的字符串 `p` 的位置 `j` 和 `j+1`,然后 `j` 自增 2。

  - 如果 `cout` 的值大于等于 10,表示当前字符出现了 10 次以上,首先将 `cout` 的十位数保存到压缩后的字符串 `p` 的位置 `j`,然后将 `cout` 的个位数保存到位置 `j+1`,最后将当前字符保存到位置 `j+2`,然后 `j` 自增 3。

循环结束后,将压缩后的字符串的结尾标志 `'\0'` 存储到 `p` 的位置 `j`,以表示字符串的结束。

在代码中,`cout` 是一个数字变量用于记录当前字符的出现次数。通过将 `cout` 的值加上字符 `'0'`,可以将其转换为对应的数字字符。

实际上,在 ASCII 编码中,数字字符 `'0'` 到 `'9'` 的 ASCII 值依次为 48 到 57。因此,将 `cout` 值加上字符 `'0'`,可以将其转换为相应的数字字符。例如,如果 `cout` 的值为 5,通过加上字符 `'0'`,就可以得到对应的字符 `'5'`。

这样做的目的是为了将数字字符存储到压缩后的字符串 `p` 中,以表示字符的出现次数。因为在压缩后的字符串中,我们需要同时保存字符和它的出现次数,所以需要将数字字符存储起来。

总结起来,这一步操作是将数字变量 `cout` 的值转换为对应的数字字符,并存储到压缩后的字符串 `p` 中,以表示字符的出现次数。

你可能感兴趣的:(c语言,c++,算法)