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

Posted Linux猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为上机真题连续字母长度相关的知识,希望对你有一定的参考价值。

🎈 作者:Linux猿

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

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

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


目录

一、题目描述

1.1 输入描述

1.2 输出描述

1.3 测试样例

1.3.1 示例 1

1.3.2 示例 2

1.3.3 示例 3

1.3.4 示例 4

二、解题思路

三、代码实现

四、时间复杂度


一、题目描述

给定一个字符串,只包含大写字母,求在包含同一个字母的子串中,长度第 k 长的子串的长度,相同字母只取最长的那个子串。若子串中只包含同一个字母的子串数小于 k,则输出 -1。

1.1 输入描述

第一行有一个字符串(1 < 长度 < 100),只包含大写字母。

第二行有一个数字,表示 k 的值。

1.2 输出描述

输出连续出现次数第 k 多的字母的次数。

1.3 测试样例

1.3.1 示例 1

输入

AAAAHHHBBCDHHHH
3

输出

2

说明:同一字母连续出现的最多的是 A 和 H,4次;第二多的是H,3次,但是 H 已经存在 4 个连续的了,故不再考虑;下个最长的子串是 BB,其长度为 2,所以最终答案应该输出 2。

1.3.2 示例 2

输入

AABAAA
2

输出

1

说明:同一字母连续出现的最多的是A,3次;第二多的还是A,两次,但是A已经出现过了,故不考虑;第二个最长子串是B,它的长度是1,所以输出1

1.3.3 示例 3

输入

ABC
4

输出

-1

说明:只含有 3 个包含同一个字母的子串,小于 k,输出 -1。

1.3.4 示例 4

输入

ABC
2

输出

1

说明:三个子串长度均为 1,所以此时k=1、k=2、k=3 这三种情况均输出 1。

二、解题思路

本题属于简单题,步骤如下所示:

(1)首先,需要统计出连续字符的长度;

(2)然后,根据长度对其逆序排序;

(3)最后,取第 k 长的字符,如果没有则输出 -1。

三、代码实现

代码实现如下所示。

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

int consecutiveLetterLength(string str, int k)

    int n = str.length();
    map<char, int>mp;
    mp[str[0]] = 1;
    int num = 1;
    for (int i = 1; i < n; ++i) 
        if (str[i] == str[i - 1]) 
            num++;
         else 
            mp[str[i-1]] = num;
            num = 1;
        
    

    if ((int)mp.size() < k) 
        return -1;
    

    vector<pair<char, int> > g;
    for (auto i = mp.begin(); i != mp.end(); ++i) 
        g.push_back(pair<char, int>(i->first, i->second));
    

    sort(g.begin(), g.end(),
         [](pair<char, int> a, pair<char, int> b)return a.second > b.second;);

    return g[k - 1].second;


int main()

    int k;
    string str;
    while (cin>>str>>k) 
        int ans = consecutiveLetterLength(str, k);
        cout<<ans<<endl;
    
    return 0;

四、时间复杂度

时间复杂度:O(n + m + mlogm)。

在上述代码中,第一个 for 循环时间复杂度为 O(n),第二个 for 循环时间复杂度为 O(m),sort 排序的时间复杂度为 O(mlogm),所以总的时间复杂度为O(n + m + mlogm),其中 n >= m。


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


以上是关于华为上机真题连续字母长度的主要内容,如果未能解决你的问题,请参考以下文章

华为OD机试真题Java实现连续字母长度真题+解题思路+代码(2022&2023)

华为机试真题 Java 实现连续字母长度

华为机试真题 C++ 实现连续字母长度

华为机试真题 C++ 实现连续字母长度

华为OD机试 - 最长连续子串(Python)| 真题+思路+考点+代码+岗位

华为OD机试真题Java实现最长连续子串真题+解题思路+代码(2022&2023)