
目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 1、输入
- 2、输出
- 3、说明
- 4、再输入
- 5、输出
- 6、说明
 
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
 
 
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
给定一个字符串,只包含大写字母,求在包含同一字母的子串中,长度第 k 长的子串的长度,相同字母只取最长的那个子串。
二、输入描述
第一行有一个子串(1<长度<=100),只包含大写字母。
第二行为 k的值
三、输出描述
输出连续出现次数第k多的字母的次数。
例如:
1、输入
AAAAHHHBBCDHHHH
 3
2、输出
2
3、说明
- 同一字母连续出现的最多的是A和H,四次;
- 第二多的是H,3次,但是H已经存在4个连续的,故不考虑;
- 下个最长子串是BB,所以最终答案应该输出2
4、再输入
AABAAA
 2
5、输出
1
6、说明
- 同一字母连续出现的最多的是A,三次;
- 第二多的还是A,两次,但A已经存在最大连续次数三次,故不考虑;
- 下个最长子串是B,所以输出1。
四、解题思路
本题的关键是理解“相同字母只取最长的那个子串”。
- 遍历输入字符串,获取每个字母最长的字符串;
- 再将其按照字符串长度降序排序;
- 获取连续出现次数第k多的字母的个数;
五、Java算法源码
package com.guor.od;
import java.util.*;
public class OdTest02 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        int index = Integer.valueOf(sc.nextLine());
        // 首字母连续字符串
        String firstSameStr = getSameChar(input);
        // 记录某字符的最大长度
        Map<Character, Integer> map = new HashMap<Character, Integer>();
        map.put(firstSameStr.charAt(0), firstSameStr.length());
        while (input.substring(firstSameStr.length()).length() > 0) {
            input = input.substring(firstSameStr.length());
            firstSameStr = getSameChar(input);
            // 如果map中没有此字符
            if (!map.containsKey(firstSameStr.charAt(0))) {
                map.put(firstSameStr.charAt(0), firstSameStr.length());
                continue;
            }
            // 获取某字符的最大长度
            if (map.get(firstSameStr.charAt(0)) < firstSameStr.length()) {
                map.put(firstSameStr.charAt(0), firstSameStr.length());
            }
        }
        // 存储相同字母最常的那个字符串
        List<String> list = new ArrayList<String>();
        for(Map.Entry<Character, Integer> entry : map.entrySet()){
            Character key = entry.getKey();
            Integer value = entry.getValue();
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < value; i++) {
                builder.append(key);
            }
            list.add(builder.toString());
        }
        // 按相同字符长度降序排列
        list.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if (o1.length() > o2.length()) {
                    return -1;
                }else if (o1.length() < o2.length()) {
                    return 1;
                }else {
                    return 0;
                }
            }
        });
        System.out.println(list);
        // 输出连续出现次数第k多的字母的次数
        System.out.println(list.get(index - 1).length());
    }
    // 获取首字母连续字符串
    public static String getSameChar(String str) {
        StringBuilder builder = new StringBuilder();
        char first = str.charAt(0);
        builder.append(first);
        for (int i = 1; i < str.length(); i++) {
            if(first != str.charAt(i)){
                break;
            }
            builder.append(str.charAt(i));
        }
        return builder.toString();
    }
}
六、效果展示
1、输入
AABBBCCCCCAAAAABB
 3
2、输出
3
3、说明
AABBBCCCCCAAAAABB
(1)遍历输入字符串,获取每个字母最长的字符串
AAAAABBBCCCCC
(2)按照其字符串长度排序
AAAAACCCCCBBB
(3)获取第3长的字符的个数
即B的个数3。

🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。



![[管理与领导-43]:IT基层管理者 - 个人管理 - 管理中从角色定位迈步](https://img-blog.csdnimg.cn/fb09492135b142e3a70612367174e3d9.png)















