华为上机真题 2022一种字符串压缩表示的解压

Posted Linux猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为上机真题 2022一种字符串压缩表示的解压相关的知识,希望对你有一定的参考价值。

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


目录

一、题目描述

1.1 输入描述

1.2 输出描述

1.3 测试样例

1.3.1 示例 1

1.3.2 示例 2

1.3.3 示例 3

二、解题思路

三、代码实现

四、时间复杂度


一、题目描述

有一种简易的压缩算法,针对全部由小写英文字母组成的字符串,将其中连续超过 2 个相同的部分压缩为连续个数加该字母,其他部分保持原样不变。例如:字符串 “aaabbccccd” 经过压缩成为字符串 “3abb4cd”。

请编写解压函数,根据输入的字符串,判断其是否为合法压缩过的字符串,若输入合法则输出解压缩后的字符串,否则输出字符串 “!error” 来报告错误。

1.1 输入描述

输入一行,为一个 ASCII 字符串,长度不会超过 100 字符,用例保证输出的字符串长度也不会超过 100 字符。

1.2 输出描述

若判断输入为合法的经过压缩后的字符串,则输出压缩前的字符串,若输入不合法,则输出 !error。

1.3 测试样例

1.3.1 示例 1

输入

4dff

输出

ddddff

1.3.2 示例 2

输入

2dff

输出

!error

说明:两个 d 不需要压缩,输入不合法。

1.3.3 示例 3

输入

4d@A

输出

!error

说明:出现特殊字符和大写字母,输入不合法。
 

二、解题思路

本题比较简单,属于模拟题,主要是将压缩的字符串解压开来,步骤如下所示:

(1)判断是否含有非法字符,如果存在,则直接输出 !error 结束程序即可;

(2)判断是否有没有按照规则压缩的字符串,例如:aaaff,aaa 应该继续压缩,如果存在,则直接输出 !error 结束程序即可;

(3)遍历输入的压缩字符串,解压缩字符串,先读取数字,按照数字输出有多少个字符,注意:如果数字是 2,则是非法字符串;

三、代码实现

代码实现如下所示。

#include <iostream>

using namespace std;

bool isSpecialCharactersExists(string str)

    int n = str.size();
    for (int i = 0; i < n; ++i) 
        if (!(str[i] >= '0' && str[i] <= '9') && !(str[i] >= 'a' && str[i] <= 'z')) 
            return true;
        
    
    return false;


int convertToNum(string str)

    if (!str.size()) return -1;
    int sum = 0;
    int n = str.size();
    for (int i = 0; i < n; ++i) 
        sum = sum * 10 + str[i] - '0';
    
    return sum;


bool isLegal(string str)

    int num = 1;
    int n = str.size();
    for (int i = 1; i < n; ++i) 
        if (str[i] == str[i-1] && (str[i] >= 'a' && str[i] <= 'z')) 
            num++;
         else 
            if (num >= 3) return false;
            num = 1;
        
    
    return num <= 2;


int main()

    string str;
    while (getline(cin, str)) 
        if(isSpecialCharactersExists(str) || !isLegal(str)) 
            cout<<"!error"<<endl;
            continue;
        

        bool flag = true;
        string ans;
        string nums;
        int n = str.size();
        for (int i = 0; i < n && flag; ++i) 
            if (str[i] >= '0' && str[i] <= '9') 
                nums += str[i];
             else 
                //cout<<nums<<endl;
                int num = convertToNum(nums);
                nums = "";
                if (0 <= num && num <= 2) 
                    flag = false;
                
                //cout<<num<<endl;
                for (int j = 0; j < num; ++j) 
                    ans += str[i];
                
                if (num == -1) 
                    ans += str[i];
                
            
        
        //cout<<flag<<endl;
        if (!flag) 
            cout<<"!error"<<endl;
            continue;
        
        cout<<ans<<endl;
    
    return 0;

四、时间复杂度

时间复杂度:O(n)

在上述代码中,将输入字符串遍历一次把压缩字符串按照规则解压开,所以时间复杂度为 O(n)。


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞


以上是关于华为上机真题 2022一种字符串压缩表示的解压的主要内容,如果未能解决你的问题,请参考以下文章

华为OD机试真题Python实现简易压缩算法真题+解题思路+代码(2022&2023)

华为OD机试题,用 Java 解一种字符串压缩表示的解压问题

华为上机真题 2022字符串分隔

华为上机真题 2022字符串排序

华为上机真题 2022字符串比较

华为上机真题 2022字符串加密