华为OD机试 2024E卷题库疯狂收录中,刷题++点这里++
专栏导读
本专栏收录于《华为OD机试真题(Python/JS/C/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),从排序后的列表中找到这个字符。
在原始字符串中查找这个字符的第一次出现位置,并返回其索引。这要求遍历原字符串,找到目标字符的位置。
六、Python算法源码
python
def find_kth_character_index(input_str, k):
# 将输入字符串转换为字符列表
char_list = list(input_str)
# 自定义排序:大写在前,小写在后,同类型按字典顺序排序
char_list.sort(key=lambda c: (c.islower(), c))
# 排序后的第 k 个字符
kth_char = char_list[k - 1] # k 是 1-based,需要 -1 转换为 0-based
# 在原字符串中找到第 k 个字符的索引
for i in range(len(input_str)):
if input_str[i] == kth_char:
return i # 返回第一个出现的索引
# 未找到字符,返回 -1
return -1
if __name__ == "__main__":
input_str = input() # 读取字符串
k = int(input()) # 读取整数 k
result = find_kth_character_index(input_str, k)
print(result) # 输出结果
七、JavaScript算法源码
javascript
function findKthCharacterIndex(inputStr, k) {
// 将输入字符串转换为字符数组
let charArray = inputStr.split('');
// 自定义排序:大写在前,小写在后,同类型按字典顺序排序
charArray.sort((c1, c2) => {
let isUpper1 = c1 === c1.toUpperCase();
let isUpper2 = c2 === c2.toUpperCase();
// 大写在前
if (isUpper1 && !isUpper2) {
return -1;
} else if (!isUpper1 && isUpper2) {
return 1;
}
// 同类型按字典顺序
return c1.localeCompare(c2);
});
// 排序后的第 k 个字符
let kthChar = charArray[k - 1]; // k 是 1-based,需要 -1 转换为 0-based
// 在原字符串中找到第 k 个字符的索引
for (let i = 0; i < inputStr.length; i++) {
if (inputStr[i] === kthChar) {
return i; // 返回第一个出现的索引
}
}
// 未找到字符,返回 -1
return -1;
}
const inputStr = prompt('请输入字符串:'); // 读取字符串
const k = parseInt(prompt('请输入整数 k:')); // 读取整数 k
const result = findKthCharacterIndex(inputStr, k);
console.log(result); // 输出结果
八、C算法源码
c
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// 比较函数:大写在前,小写在后,同类型按字典顺序排序
int compare(const void *a, const void *b) {
char c1 = *(char *)a;
char c2 = *(char *)b;
int isUpper1 = isupper(c1);
int isUpper2 = isupper(c2);
// 大写在前
if (isUpper1 && !isUpper2) {
return -1;
} else if (!isUpper1 && isUpper2) {
return 1;
}
// 同类型按字典顺序
return c1 - c2;
}
int findKthCharacterIndex(char *input, int k) {
int len = strlen(input);
char sorted[len + 1];
strcpy(sorted, input);
// 排序
qsort(sorted, len, sizeof(char), compare);
// 排序后的第 k 个字符
char kthChar = sorted[k - 1]; // k 是 1-based,需要 -1 转换为 0-based
// 在原字符串中找到第 k 个字符的索引
for (int i = 0; i < len; i++) {
if (input[i] == kthChar) {
return i; // 返回第一个出现的索引
}
}
// 未找到字符,返回 -1
return -1;
}
int main() {
char input[100];
int k;
// 读取输入
printf("请输入字符串: ");
scanf("%s", input);
printf("请输入整数 k: ");
scanf("%d", &k);
int result = findKthCharacterIndex(input, k);
printf("%d\n", result); // 输出结果
return 0;
}
九、C++算法源码
cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <cctype>
using namespace std;
// 自定义比较函数:大写在前,小写在后,同类型按字典顺序排序
bool compare(char c1, char c2) {
bool isUpper1 = isupper(c1);
bool isUpper2 = isupper(c2);
// 大写在前
if (isUpper1 && !isUpper2) {
return true;
} else if (!isUpper1 && isUpper2) {
return false;
}
// 同类型按字典顺序
return c1 < c2;
}
int findKthCharacterIndex(string input, int k) {
vector<char> charList(input.begin(), input.end());
// 排序
sort(charList.begin(), charList.end(), compare);
// 排序后的第 k 个字符
char kthChar = charList[k - 1]; // k 是 1-based,需要 -1 转换为 0-based
// 在原字符串中找到第 k 个字符的索引
for (int i = 0; i < input.length(); i++) {
if (input[i] == kthChar) {
return i; // 返回第一个出现的索引
}
}
// 未找到字符,返回 -1
return -1;
}
int main() {
string input;
int k;
// 读取输入
cout << "请输入字符串: ";
cin >> input;
cout << "请输入整数 k: ";
cin >> k;
int result = findKthCharacterIndex(input, k);
cout << result << endl; // 输出结果
return 0;
}
🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)
🏆本文收录于,华为OD机试真题(Python/JS/C/C++)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。