华为OD机试 - 第 K 个字母在原来字符串的索引(Java 2024 E卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
给定一个字符串🔍,把字符串按照大写在前小写在后排序,输出排好后的第 K 个字母在原来字符串的索引。
相同字母输出第一个出现的位置。
二、输入描述
无
三、输出描述
无
四、测试用例
测试用例1:
1、输入
hAkDAjByBq 4
2、输出
6
3、说明
排好序后 AABBDhjkqy,第 4 个是 B,第一个出现的在原字符串 6 这个位置。(注:索引是从 0 开始)
测试用例2:
1、输入
ABCDWXYZ 3
2、输出
2
3、说明
按照大写字母在前,小写字母在后的规则进行排序(输入中只有大写字母),并按字典顺序排列,结果为:ABCDWXYZ(与输入顺序相同)。
排序后第 3 个字符是 C。
在原始字符串 ABCDWXYZ 中,C 第一次出现的位置是索引 2(索引从 0 开始)。
五、解题思路
根据题目要求,我们需要将字符串中的字符按照大写字母在前、小写字母在后排列,且保持字典顺序。为了实现这个过程,我们需要进行分类排序。大写字母需要被优先排列,其次是小写字母,而其他符号可以忽略。
将字符串分割成两类:大写字母和小写字母。我们先按照大小写区分排序,然后对每一类字母按照字典顺序排序,这样可以确保大写字母在前,小写字母在后,并且同类型的字符保持字典顺序。
根据用户输入的第 K 个字符(1-based index),从排序后的列表中找到这个字符。
在原始字符串中查找这个字符的第一次出现位置,并返回其索引。这要求遍历原字符串,找到目标字符的位置。
六、Java算法源码
public class OdTest01 {public static void main(String[] args) {// 使用 Scanner 从标准输入读取数据Scanner scanner = new Scanner(System.in);String input = scanner.next(); // 读取字符串int k = scanner.nextInt(); // 读取整数 kscanner.close();int result = findKthCharacterIndex(input, k);System.out.println(result); // 输出结果}public static int findKthCharacterIndex(String input, int k) {// 将输入字符串转换为字符列表List<Character> charList = new ArrayList<>();for (char c : input.toCharArray()) {charList.add(c);}// 自定义比较器:大写在前,小写在后,同类型按字典顺序排序Collections.sort(charList, new Comparator<Character>() {@Overridepublic int compare(Character c1, Character c2) {boolean isUpper1 = Character.isUpperCase(c1);boolean isUpper2 = Character.isUpperCase(c2);// 大写在前if (isUpper1 && !isUpper2) {return -1;} else if (!isUpper1 && isUpper2) {return 1;}// 同类型按字典顺序return c1 - c2;}});// 排序后的第 k 个字符char kthChar = charList.get(k - 1); // k 是 1-based,需要 -1 转换为 0-based// 在原字符串中找到第 k 个字符的索引for (int i = 0; i < input.length(); i++) {if (input.charAt(i) == kthChar) {return i; // 返回第一个出现的索引}}// 未找到字符,返回 -1return -1;}
}
七、效果展示
1、输入
aBcDwXyZ 8
2、输出
6
3、说明
按照大写字母在前,小写字母在后的规则进行排序,结果为:BDWZacwy。
排序后的第 8 个字符是 y。
在原始字符串 aBcDwXyZ 中,字符 y 第一次出现的位置是索引 6(索引从 0 开始)。
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。