华为上机真题 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

二、解题思路

三、代码实现

四、时间复杂度


注意:题目来源于网络用户分享,本文仅分享做题思路和方法,如有侵权请联系我删除!

一、题目描述

给定一个非空字符串 S,其被 N 个 ‘-’ 分隔成 N+1 的子串,给定正整数 K,要求除第一个子串外,其余的子串每 K 个字符组成新的子串,并用 ‘-’ 分隔。

对于新组成的每一个子串:

(1)如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;

(2)反之,如果它含有的大写字母比小写字母多,则将这个子串的所有小写字母转换为大写字母;

(3)大小写字母的数量相等时,不做转换。

1.1 输入描述

输入为两行,第一行为参数 K,第二行为字符串 S。

1.2 输出描述

输出转换后的字符串。

1.3 测试样例

1.3.1 示例1

输入

3
12abc-abCABc-4aB@

输出

12abc-abc-ABC-4aB-@

说明:子串为 12abc、abCABc、4aB@,第一个子串保留,后面的子串每 3 个字符一组为 abC、ABc、4aB、@,abC 中小写字母较多,转换为 abc,ABc 中大写字母较多,转换为ABC,4aB中大小写字母都为 1 个,不做转换,@中没有字母,连起来即12abc-abc-ABC-4aB-@

1.3.2 示例 2

输入

12
12abc-abCABc-4aB@

输出

12abc-abCABc4aB@

说明:子串为 12abc、abCABc、4aB@,第一个子串保留,后面的子串每 12 个字符一组为 abCABc4aB@,这个子串中大小写字母都为 4 个,不做转换,连起来即 12abc-abCABc4aB@
 

二、解题思路

本题是一个模拟题,提取通过 ‘-’ 分隔的字符串,以输入的 K 长度为分隔重新划分,但是,新划分的字符串需要判断大小写字母的个数,并根据大小写字母个数对字符串进行转化。

三、代码实现

代码实现如下所示。

#include <iostream>
#include <sstream>
using namespace std;

//处理大小写字母的转化
string solve(string str)

    int n = str.size();
    int num1 = 0, num2 = 0;
    for (int i = 0; i < n; ++i) 
        if (islower(str[i])) 
            num1++;
        
        if (isupper(str[i])) 
            num2++;
        
    

    if (num1 > num2) 
        for (int i = 0; i < n; ++i) 
            if (isupper(str[i])) 
                str[i] = tolower(str[i]);
            
        
    
    if (num1 < num2) 
        for (int i = 0; i < n; ++i) 
            if (islower(str[i])) 
                str[i] = toupper(str[i]);
            
        
    
    return str;


int main()

    int K;
    while (cin>>K) 
        getchar();
        string str;
        getline(cin, str);
        stringstream stream(str);

        bool flag = true;
        string ans;
        string preStr = "";
        while (getline(stream, str, '-')) 
            if (flag)  // 第 1 个不处理
                ans += str;
                flag = false;
                continue;
            
            str = preStr + str;
            if ((int)str.size() >= K) 
                while ((int)str.size() >= K) 
                    ans += '-' + solve(str.substr(0, K));
                    str = str.substr(K);
                
            
            preStr = str;
        
        if (preStr.size()) 
            ans += '-' + preStr;
        
        cout<<ans<<endl;
    
    return 0;

在上述代码中,通过 getline 分割 ‘-’ 分割的字符串,然后根据 K 进行划分。函数 solve 处理大小写字母的转化。

四、时间复杂度

时间复杂度:O(n^2)

在上述代码中,需要先根据 ‘-’ 分割字符串,然后还需要遍历每个按照 K 新划分的字符串,根据新字符串中大小写字母的个数转化字符串。


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


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

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

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

华为上机真题 2022字符串序列判定

华为上机真题 2022字符串最后一个单词的长度

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

华为上机真题连续字母长度