C语言 蓝桥杯- 解码

目录

  1. 题目描述

  1. 输入、输出格式

  1. 输入、输出样式

  1. 说明/提示

  1. 做题思路

  1. 代码


  1. 解码题目描述

小明有一串很长的英文字母,可能包含大写和小写。

在这串字母中,有很多连续的是重复的。小明想了一个办法将这串字母表达得更短:将连续的几个相同字母写成字母 + 出现次数的形式。 例如,连续的 5 个 a,即 aaaaa,小明可以简写成 a5(也可能简写成 a4a、aa3a 等)。

对于这个例子:HHHellllloo,小明可以简写成 H3el5o2。为了方便表达,小明不会将连续的超过9个相同的字符写成简写的形式。

现在给出简写后的字符串,请帮助小明还原成原来的串。


  1. 输入、输出格式

输入格式

输入一行包含一个字符串。

输出格式

输出一个字符串,表示还原后的串。


  1. 输入、输出样式

输入 #1

H3el5o2

输出 #1

HHHellllloo


  1. 说明/提示


对于所有评测用例,字符串由大小写英文字母和数字组成,长度不超过 100100。请注意原来的串长度可能超过 100100。

蓝桥杯 2020 第一轮省赛 A 组 F 题(B 组 G 题)。


5做题思路

5.1数据存放

本题目在输入格式中就提到"字符串",加上需要既输入字母又输入数字,所以得出我们需要使用一个字符型数组来存放字符串

在创建字符型数组的时候,发现说明,测试用例的字符串长度不超过100,而原字符串长度可能超过100,加上题目描述,小明不会将连续的超过9个相同的字符写成简写的形式

这里,我们以最坏的情况来考虑,假设小明给了100个字符串长度,每个字母都是9,那么,真实字符串的大小可能是50*9,也就是450为数组的最小 大小。也就是如下代码

这样,我们就可以完美储存原字符串了。

值得注意的是,这道题目有两种储存数据的方法:一种是在原数组里储存、打印;另一种是将输入的字符串扩展成原字符串到另一个数组。这里我用的是第一个方法。


5.2 数据判断

仔细观察,发现输入样例有H3el5,所以在读取数据时需要讨论前后两个数据都是字母的情况


5.3主要思路

基本思路:有序数组在内存中是连续存放的

核心思路:数据是字母+数字在内存中连续存放,其中,数字为1会省略

这样,我们就可以使用两个指针来指向这个数组,一个指针指向字母,另一个指针指向数字,然后根据指向数字的指针得出循环次数,将字母循环打印即可,如果两个都是字母,则打印前一个指针的字母一次,然后++。

这里就是直观的图像

然后开始代码

由于我们scanf的输入格式是%s,所以输入的数字会被转化成字符数字,在循环时需要减去'0'才能得到对应的数字,打印完成后指针会指向后两个元素,进而继续判断


6.代码

#include<stdio.h>
int main()
{
    char arr[450] = { 0 };
    scanf("%s", arr);
    int situ = 0;
    int news = 1;
    while (arr[situ] != 0)
    {
        if (arr[news] >= '0' && arr[news] <= '9')
        {
            int tmp = arr[news] - '0';
            while (tmp--)
            {
                printf("%c", arr[situ]);
            }
            situ += 2;
            news += 2;
        }
        else//字母
        {
            printf("%c", arr[situ]);
            situ += 1;
            news += 1;
        }
    }
    return 0;
}

ps:这是萌新的第一篇博客,希望大家喜欢,有什么需要改进的地方大家可以提出来,以后会不定期更新一些蓝桥杯的博客的

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值