华为OD机试真题 Java 实现【获取字符串中连续出现次数第k多的字母的次数】【2023Q1 100分】,附详细解题思路
一、题目描述
给定一个字符串,只包含大写字母,求在包含同一字母的子串中,长度第 k 长的子串的长度,相同字母只取最长的那个子串。
二、输入描述
- 第一行有一个子串(1<长度<=100),只包含大写字母;
- 第二行为 k的值;
三、输出描述
输出连续出现次数第k多的字母的次数。
四、解题思路
- 读取输入的字符串和 k 值;
- 将字符串转换为字符数组;
- 使用 HashMap 统计每个字符连续出现的次数;
- 遍历字符数组,记录当前字符和连续出现次数;
- 更新字符的最大连续出现次数;
- 将字符和最大连续出现次数存储在 HashMap 中;
- 将 HashMap 转换为 List,并按照值的降序进行排序;
- 判断 k 是否超过了 List 的长度,如果超过则输出 -1,否则输出第 k 个元素的值;
- 输出最终结果。
五、Java算法源码
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);char[] arr = (scanner.nextLine()).toCharArray();int k = scanner.nextInt();Map<Character, Integer> map = new HashMap<Character, Integer>();char current = arr[0];char temp;int count = 0;for (int i = 0; i < arr.length; i++) {temp = arr[i];if (temp == current) {// 相等,数量加1count++;} else {// 重置统计参数current = temp;count = 1;}// 记录if (map.containsKey(current)) {map.put(current, Math.max(map.get(current), count));} else {map.put(current, count);}}// 根据次数排序,从高到底List<Map.Entry<Character, Integer>> list = new ArrayList<>(map.entrySet());list.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));// 打印第k多次的子串字母出现次数if (k > list.size()) {System.out.println(-1);} else {System.out.println(list.get(k - 1).getValue());}
}
六、效果展示
1、输入
qqwwweeeerrrrrtttttt
3
2、输出
第三长的字符的个数,很明显就是eeee,4。
3、说明
同一字母连续出现的最多的是t,6次;第二多的还是r,5次,第三多的就是e,一共4个e,所以输出4。
🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。