华为OD机试 2023B卷题库疯狂收录中,刷题点这里
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
给定一个字符串,只包含大写字母,求在包含同一字母的子串中,长度第 k 长的子串的长度,相同字母只取最长的那个子串。
第一行有一个子串(1<长度<=100),只包含大写字母。
第二行为 k的值
输出连续出现次数第k多的字母的次数。
例如:
AAAAHHHBBCDHHHH
3
2
AABAAA
2
1
本题的关键是理解“相同字母只取最长的那个子串”。
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();
}
}
AABBBCCCCCAAAAABB
3
3
AABBBCCCCCAAAAABB
(1)遍历输入字符串,获取每个字母最长的字符串
AAAAABBBCCCCC
(2)按照其字符串长度排序
AAAAACCCCCBBB
(3)获取第3长的字符的个数
即B的个数3。
下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】
本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。