(c语言)字符串数组的压缩(比如,字符串aabcccccaaa会变为a2b1c5a3)

本文介绍了如何使用C语言实现一个简单的字符串压缩算法,通过统计连续字符并将其数量表示在输出字符串中,只有当压缩后的长度大于原长度时才输出原字符串。作者分享了详细的步骤和代码实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.先看题目:

题目:
                                编写一种方法,实现基本的字符串压缩功能。
                                比如,字符串aabcccccaaa会变为a2b1c5a3。
                                假如压缩后的字符串的长度不小于原字符串的长度,则输出原来的字符串。

小白的摸爬滚打心酸史,如有大佬请自行略过。

花了一个个晚上各种查资料,各种尝试,调试,最后终于跑出来了。wwww~~

二.思路

废话不多说,咱们先来看思路。

这里我想到的是在定义一个字符串数组b[],把要我们输出的结果储存在数组b[]中,然后把数组b[]给打印出来。

1.

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>           
                             //题目:
                             //编写一种方法,实现基本的字符串压缩功能。
                             // 比如,字符串aabcccccaaa会变为a2b1c5a3,
                             // 假如压缩后的字符串的长度不小于原字符串的长度,则输出原来的字串。
int main()
{
    char a[100];
    char b[100];
    scanf("%s", a);
    int l = strlen(a);

首先咱们先创建两个数组a和b ,a用来储存原来输入的字符串,b用来储存需要我们输出的字符串。

2.

int count = 1;               //定义一个count,用来统计每一个字母的数量;
int flag = 0;                //定义一个flag,用flag作为数组a[]遍历的变量;

因为一旦读取到一个字母,它的数量就为1,因此我们定义count初始值为1;

定义一个count,用来统计每一个字母的数量;         

定义一个flag,用flag作为数组a[]遍历的变量;

3.

for (int j = 0; j < l; j++)
{
    if (j % 2 == 0)          //通过观察我们发现数组b中从0开始,偶数位为字母,奇数位为它的数量;
        b[j] = a[flag];      //因此,我们设置变量j,当j为偶数时,我们把b[j]置为a[]中相应的字母;
    else                     //当j为奇数时,我们把b[j]置为数字;
    {
        b[j] = count;
        count = 1;           //b[j]统计完一个字母的数字后,将count重新置为1;
        flag++;              //继续进行下一个字母的统计;
    }
    while (a[flag + 1] == a[flag])
    {
        count++;
        flag++;
    }
}

接下来是循环体部分,见上图代码中的注释,

感觉写的有点复杂了,可能各位大佬有更简便的方法

这里如果不好理解,可以举个例子具体算一遍,感受一下哈。

4.

    int l2 = strlen(b);
    if (l > l2)
    {
        for (int i = 0; i < l2; i++)
        {
            if (i % 2 == 0)
                printf("%c", b[i]);   //若数组b[j]中的元素为字母,用占位符%c输出;
            else if (i % 2 == 1)
                printf("%d", b[i]);   //若数组b[j]中的元素为数字,要用占位符%d输出;
        }
    }
    else
    {
        for (int i = 0; i < l; i++)
        {
            printf("%c", a[i]);
        }
    }

    return 0;
}

最后一步了,这里一开始我打印数组b中的数字的时候用%c作为占位符,结果打印出来全是问号❓后面查资料才知道要用%d作为占位符,这里我真的哭死。。。。。

好了,这就是小白我的思路了,接下来给全代码:

#include<stdio.h>
#include<string.h>              //题目:
                                //编写一种方法,实现基本的字符串压缩功能。
                                // 比如,字符串aabcccccaaa会变为a2b1c5a3,
                                // 假如压缩后的字符串的长度不小于原字符串的长度,则输出原来的字符串。
int main()
{
    char a[100];
    char b[100];
    scanf("%s", a);
    int l = strlen(a);


    int count = 1;               //定义一个count,用来统计每一个字母的数量;
    int flag = 0;                //定义一个flag,用flag作为数组a[]遍历的变量;
    for (int j = 0; j < l; j++)
    {
        if (j % 2 == 0)          //通过观察我们发现数组b中从0开始,偶数位为字母,奇数位为它的数量;
            b[j] = a[flag];      //因此,我们设置变量j,当j为偶数时,我们把b[j]置为a[]中相应的字母;
        else                     //当j为奇数时,我们把b[j]置为数字;
        {
            b[j] = count;
            count = 1;           //b[j]统计完一个字母的数字后,将count重新置为1;
            flag++;              //继续进行下一个字母的统计;
        }
        while (a[flag + 1] == a[flag])
        {
            count++;
            flag++;
        }
    }
    int l2 = strlen(b);
    if (l > l2)
    {
        for (int i = 0; i < l2; i++)
        {
            if (i % 2 == 0)
                printf("%c", b[i]);   //若数组b[j]中的元素为字母,用占位符%c输出;
            else if (i % 2 == 1)
                printf("%d", b[i]);   //若数组b[j]中的元素为数字,要用占位符%d输出;
        }
    }
    else
    {
        for (int i = 0; i < l; i++)
        {
            printf("%c", a[i]);
        }
    }

    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值