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

相关推荐
qq_589568107 分钟前
Echarts的高级使用,动画,交互api
前端·javascript·echarts
晚夜微雨问海棠呀10 分钟前
长沙景区数据分析项目实现
开发语言·python·信息可视化
cdut_suye20 分钟前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python
dundunmm43 分钟前
机器学习之scikit-learn(简称 sklearn)
python·算法·机器学习·scikit-learn·sklearn·分类算法
古希腊掌管学习的神43 分钟前
[机器学习]sklearn入门指南(1)
人工智能·python·算法·机器学习·sklearn
一道微光1 小时前
Mac的M2芯片运行lightgbm报错,其他python包可用,x86_x64架构运行
开发语言·python·macos
四口鲸鱼爱吃盐1 小时前
Pytorch | 利用AI-FGTM针对CIFAR10上的ResNet分类器进行对抗攻击
人工智能·pytorch·python
是娜个二叉树!2 小时前
图像处理基础 | 格式转换.rgb转.jpg 灰度图 python
开发语言·python
互联网杂货铺2 小时前
Postman接口测试:全局变量/接口关联/加密/解密
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·postman
暴富的Tdy2 小时前
【CryptoJS库AES加密】
前端·javascript·vue.js