字符串筛选排序 - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 100分

题解: Java / Python / C++

alt

题目描述

输入一个由n个大小写字母组成的字符串, 按照 ASCII 码值从小到大的排序规则,查找字符串中第 k 个最小ASCII 码值的字母(k>=1) ,

输出该字母所在字符串的位置索引(字符串的第一个字符位置索引为0) 。

k 如果大于字符串长度,则输出最大 ASCII 码值的字母所在字符串的位置索引;

如果有重复的字母,则输出字母的最小位置索引。

输入描述

  • 第一行输入一个由大小写字母组成的字符串
  • 第二行输入k,k必须大于o,k可以大于输入字符串的长度

输出描述

  • 输出字符串中第k个最小ASCII码值的字母所在字符串的位置索引,
  • k如果大于字符串长度,则输出最大ASCII值的字母所在字符串的位置索引,
  • 如果第k个最小ascii码值的字母存在重复,则输出该字母的最小位置索引。

示例1

输入:
AbCdeFG
3

输出:
5

说明:
根据 ASCII码值排序,第三个 ASCII码值的字母为F在字符串中位置索引为5 (0 为字符串的一个字母位置索引)

示例2

输入:
fAdDAkBbBq
4

输出:
6

说明:
根据asci1码值排序,前4个字母为AABB,由于3重复,则只取B的(第一个)最小位置索引6,而不是第二个B的位置索引8

题解

这道题属于排序算法的应用,需要根据字符串中字符的ASCII码值进行排序,并根据给定的k值找到对应位置的字符索引。以下是解题思路、代码描述以及时间空间复杂度分析:

解题思路

  1. 首先将输入的字符串拆分成字符和对应的索引位置的数组形式,方便后续排序。
  2. 对字符数组按照字符的ASCII码值和索引位置进行排序,以满足题目要求的排序规则。
  3. 输入k值,如果k大于字符串长度,则直接输出最大ASCII码值的字符所在的位置索引。
  4. 否则,找到第k个最小ASCII码值的字符,如果存在重复字符,则输出该字符的最小位置索引。

代码描述

  • Java代码使用了Scanner进行输入,然后使用List和Collections进行排序和查找。
  • Python代码通过input()获取输入,使用列表和sort()方法进行排序和查找。
  • C++代码使用cin进行输入,然后使用vector和sort()函数进行排序和查找。

时间复杂度

  • 时间复杂度为O(nlogn),其中n为输入字符串的长度,主要由排序算法决定。

空间复杂度

  • 空间复杂度为O(n),需要额外的空间存储字符和索引位置的数组。

Java

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

/**
 * @author code5bug
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();

        // 将字符串拆成 <码值,位置索引> 的数组形式,方便后续排序
        List<int[]> arr = new ArrayList<>();
        for (int i = 0; i < s.length(); i++) {
            arr.add(new int[]{s.charAt(i), i});
        }

        // 按照题目要求根据码值和索引位置排序
        Collections.sort(arr, (a, b) -> {
            if (a[0] != b[0]) {
                return a[0] - b[0];
            } else {
                return a[1] - b[1];
            }
        });

        int k = scanner.nextInt();

        // k 如果大于字符串长度则输出最大 ASCII 码值的字母所在字符串的位置索引
        k = Math.min(k, arr.size());

        int resultIdx = arr.get(k - 1)[1];

        // 如果第 k 个最小 ASCII 码值的字母存在重复,则输出该字母的最小位置索引
        for (int x = 2; k - x >= 0 && arr.get(k - x)[0] == arr.get(k - 1)[0]; x++) {
            resultIdx = arr.get(k - x)[1];
        }
        System.out.println(resultIdx);
    }
}

Python


# 主函数
def main():
    # 输入字符串
    s = input().strip()

    # 将字符串拆成 <码值,位置索引> 的数组形式,方便后续排序
    arr = [(char, index) for index, char in enumerate(s)]

    # 按照题目要求根据码值和索引位置排序
    arr.sort()

    # 输入k
    k = int(input())

    # k 如果大于字符串长度则输出最大 ASCII 码值的字母所在字符串的位置索引
    k = min(k, len(arr))

    result_idx = arr[k - 1][1]

    # 如果第 k 个最小 ASCII 码值的字母存在重复,则输出该字母的最小位置索引
    x = 2
    while k - x >= 0 and arr[k - x][0] == arr[k - 1][0]:
        result_idx = arr[k - x][1]
        x += 1

    print(result_idx)


# 调用主函数
if __name__ == "__main__":
    main()

C++

#include <bits/stdc++.h>

using namespace std;

int main()
{
    string s;
    cin >> s;

    // 将字符串拆成 <码值,位置索引> 的数组形式,方便后续排序
    vector<pair<char, int>> arr;
    for (size_t i = 0; i < s.length(); i++) {
        arr.push_back({s[i], i});
    }

    // 按照题目要求根据 码值 和索引位置排序
    sort(arr.begin(), arr.end(), [](pair<char, int> a, pair<char, int> b) {
        if (a.first != b.first) {
            return a.first < b.first;
        } else {
            return a.second < b.second;
        }
    });

    size_t k;
    cin >> k;

    // k 如果大于字符串长度则输出最大 ASCII 码值的字母所在字符串的位置索引
    k = min(k, arr.size());

    size_t result_idx = arr[k - 1].second;

    // 如果第 k 个最小 ASCII 码值的字母存在重复,则输出该字母的最小位置索引
    int x = 2;
    while (k - x >= 0 && arr[k - x].first == arr[k - 1].first) {
        result_idx = arr[k - x].second;
        x++;
    }
    cout << result_idx << endl;

    return 0;
}    

相关练习题

题号题目难易
LeetCode 16361636. 按照频率将数组升序排序简单
LeetCode 451451. 根据字符出现频率排序中等

有考友通过专栏已经快速通过机考✍,都是原题哦, 🎁🎁🎁 立即订阅

希望这个专栏不仅能帮您成功通过华为机试,还能让您熟练掌握算法。

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/471561.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS学习(3)-浮动和定位

一、浮动 1. 元素浮动后的特点 脱离文档流。不管浮动前是什么元素&#xff0c;浮动后&#xff1a;默认宽与高都是被内容撑开&#xff08;尽可能小&#xff09;&#xff0c;而且可以设置宽 高。不会独占一行&#xff0c;可以与其他元素共用一行。不会 margin 合并&#xff0c;…

C语言易错知识点

1、数组长度及所占字节数 char x[] {"Hello"},y[]{H,e,l,l,o}; x数组的长度为5&#xff0c;y的长度也是5 x、y数组所占字符串为6为 51(\0)6 strlen&#xff08;&#xff09;函数得到的是数组的长度 2、%%与%的优先级 #include<stdio.h> int main(){ int a…

HarmonyOS4.0—自定义渐变导航栏开发教程

前言 今天要分享的是一个自定义渐变导航栏&#xff0c;本项目基于鸿蒙4.0。 先看效果&#xff1a; 这种导航栏在开发中也比较常见&#xff0c;特点是导航栏背景色从透明到不透明的渐变&#xff0c;以及导航栏标题和按钮颜色的变化。 系统的导航栏无法满足要求&#xff0c;我们…

Visual Studio 2013 - 高亮设置括号匹配 (方括号)

Visual Studio 2013 - 高亮设置括号匹配 [方括号] 1. 高亮设置 括号匹配 (方括号)References 1. 高亮设置 括号匹配 (方括号) 工具 -> 选项… -> 环境 -> 字体和颜色 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

基于信号分解的几种一维时间序列降噪方法(MATLAB R2021B)

自适应信号分解算法是一种适合对非平稳信号分析的方法&#xff0c;它将一个信号分解为多个模态叠加的形式&#xff0c;进而可以准确反应信号中所包含的频率分量以及瞬时频率随时间变化的规律。自适应信号分解算法与众多“刚性”方法(如傅里叶变换&#xff0c;小波变换)不同&…

R语言实现多要素偏相关分析

偏相关分析是指当两个变量同时与第三个变量相关时&#xff0c;将第三个变量的影响剔除&#xff0c;只分析另外两个变量之间相关程度的过程&#xff0c;判定指标是相关系数的R值。 在GIS中&#xff0c;偏相关分析也十分常见&#xff0c;我们经常需要分析某一个指数与相关环境参…

浅谈一下对于DDD模式的理解2

浅谈一下对于DDD模式的理解&#xff0c;相互学习交流&#xff0c;不对之处欢迎大家指正。 在说到DDD(Domain-Driven Design)设计模式之前&#xff0c;先要说下我们在对系统进行架构设时需要遵循的几个原则&#xff1a; 单一职责&#xff08;SRP&#xff09; "单一职责原则…

原来这才是帕金森症状得到缓解的秘诀!

帕金森是一种影响神经系统的慢性疾病&#xff0c;主要症状包括震颤、肌肉僵硬和运动缓慢。如不及时治疗控制&#xff0c;症状可能会逐渐加重&#xff0c;严重影响生活质量。患者可能丧失自理能力&#xff0c;出现跌倒、骨折等并发症&#xff0c;还可能伴随认知障碍和情绪问题。…

考研数学|汤家凤《1800题》什么阶段做?值不值得做?

1800总的来说还是一本对基础不太好的同学一本不错的习题册&#xff0c;当然他可能对基础较好的同学来说题目量过大 考研数学备考&#xff0c;刷1800题是否必要&#xff1f;从我的经验来看&#xff0c;刷1800题并不是绝对必要的&#xff0c;而且传统习题册存在一些问题&#xf…

计算机组成原理 — 计算机的运算方法

计算机的运算方法 计算机的运算方法无符号数和有符号数概念有符号数有符号数又分真值和机器数原码表示法补码表示法反码表示法三种机器数的特点移码表示法 数的定点表示和浮点表示定点表示浮点表示 定点运算移位运算算数移位规则加法与减法运算乘法运算除法运算概述恢复余数法加…

ChatGPT人工智能对话系统源码 电脑版+手机端+小程序三合一 带完整的安装代码包以及搭建教程

ChatGPT人工智能对话系统的研发&#xff0c;源于对自然语言处理技术的深入研究和探索。在人工智能领域&#xff0c;自然语言处理是实现人机交互的关键技术之一。通过模拟人类的自然语言交流方式&#xff0c;对话系统能够理解用户的意图和需求&#xff0c;并给出相应的回应。 以…

【Qt学习笔记】(三)--编写上位机软件(ui设置、样式表serialport串口接收数据、Qchart显示波形)

声明&#xff1a;本人水平有限&#xff0c;博客可能存在部分错误的地方&#xff0c;请广大读者谅解并向本人反馈错误。    这段时间大部分都是在学Qt&#xff0c;前面想着跟着书一章章的学&#xff0c;但是发现这个效率极低&#xff0c;所以就改变了学习的方法&#xff0c;那…

QT6实现创建与操作sqlite数据库及读取实例(一)

一.Qt为SQL数据库提供支持的基本模块&#xff08;Qt SQL&#xff09; Qt SQL的API分为不同层&#xff1a; 驱动层 SQL API层 用户接口层 1.驱动层 对于Qt 是基于C来实现的框架&#xff0c;该层主要包括QSqlDriver&#xff0c;QSqlDriverCreator,QSqlDriverCreatorBase,QSqlPlug…

初识GO语言

是由google公司推出的一门编程语言&#xff0c;12年推出的第一个版本 Go的特点 Go为什么能在最近的IT领域炙手可热 集python简洁&C语言的性能于一身 21世纪的C语言 顺应容器化时代的到来 区块链的崛起 学习一门编程语言可以划分为下面这三个步骤 安装 编译器 or 解…

C语言种sizeof()和strlen的区别

sizeof 是 C 语言内置的操作符关键字&#xff0c;而 strlen 是 C 语言库函数&#xff1b; sizeof 仅用于计算数据类型的大小或者变量的大小&#xff0c;而 strlen 只能以结尾为 \0 的字符串作为参数&#xff1b; 编译器在编译时就计算出了 sizeof 的结果&#xff0c;而 strlen …

【内核内存管理、动态分配及IO访问、LED驱动】

一、内核内存管理框架 内核将物理内存等分成N块4KB&#xff0c;称之为一页&#xff0c;每页都用一个struct page来表示&#xff0c;采用伙伴关系算法维护 内核地址空间划分图&#xff1a; 3G~3G896M&#xff1a;低端内存&#xff0c;直接映射 虚拟地址 3G 物理地址 ​ 细…

YOLOv8独家改进:block改进 | RepViTBlock和C2f进行结合实现二次创新 | CVPR2024清华RepViT

💡💡💡本文独家改进:CVPR2024 清华提出RepViT:轻量级新主干!从ViT角度重新审视移动CNN,RepViTBlock和C2f进行结合实现二次创新 改进结构图如下: 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm=1001.2014.3001.5482 💡…

UML学习体会

1. 水在前面 本来写作的水平就很一般&#xff0c;平时写的也少。最近看到一些文章说学习最好的方式是输出&#xff0c;刚好又重温了一遍UML方面的基础&#xff0c;所以想记录点学习心得。而且说实话这玩意平时基本不怎么用&#xff08;偶尔倒是看看别人的成果&#xff09;&…

mabatis 下

mybatis 原生的API&注解的方式MyBatis-原生的API调用快速入门需求快速入门代码实现 MyBatis-注解的方式操作快速入门需求快速入门代码实现注意事项和说明 mybatis-config.xml配置文件详解说明properties属性settings全局参数定义typeAliases别名处理器typeHandlers类型处理…

麒麟 V10 一键安装 Oracle 11GR2(231017)单机版

Oracle 一键安装脚本&#xff0c;演示 麒麟 V10 一键安装 Oracle 11GR2 单机版过程&#xff08;全程无需人工干预&#xff09;&#xff1a;&#xff08;脚本包括 ORALCE PSU/OJVM 等补丁自动安装&#xff09; ⭐️ 脚本下载地址&#xff1a;Shell脚本安装Oracle数据库 脚本第…