华为OD机试 - 第 K 个字母在原来字符串的索引(Python/JS/C/C++ 2024 E卷 100分)

华为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在线答疑。

相关推荐
前端涂涂3 分钟前
JavaScript面试宝典
前端·javascript
补三补四5 分钟前
Django与视图
数据库·python·django·sqlite
木卯14 分钟前
5种创建型设计模式笔记(Python实现)
python·设计模式
张琪杭30 分钟前
pytorch tensor创建tensor
人工智能·pytorch·python
潜龙在渊灬36 分钟前
前端 UI 框架发展史
javascript·vue.js·react.js
星星点点洲40 分钟前
【RAG】RAG 系统的基本搭建流程(ES关键词检索示例)
python·elasticsearch
带娃的IT创业者1 小时前
《Python实战进阶》No18: 使用 Apache Spark 进行分布式计算
python·spark·apache
Tomorrow'sThinker1 小时前
Python零基础学习第三天:函数与数据结构
开发语言·windows·python
元媛媛1 小时前
Python - 轻量级后端框架 Flask
开发语言·python·flask
疏狂难除2 小时前
基于Rye的Django项目通过Pyinstaller用Github工作流简单打包
后端·python·django