一、问题描述
题目描述
给定一个字符串,把字符串按照大写在前小写在后排序,输出排好后的第 K 个字母在原来字符串的索引。相同字母输出第一个出现的位置。
输入描述
无
输出描述
无
用例
用例 1
输入:
hAkDAjByBq 4
输出:
6
说明:
排好序后 AABBDhjkqy
,第 4 个是 B
,第一个出现的在原字符串 6 这个位置。(注:索引是从 0 开始)
解题思路
-
读取输入:
- 从标准输入读取一个字符串和一个整数
K
。
- 从标准输入读取一个字符串和一个整数
-
排序:
- 将字符串中的字符按照大写在前小写在后的顺序排序。具体来说,先将所有大写字母按字典序排序,然后将所有小写字母按字典序排序。
-
查找第 K 个字符:
- 在排序后的字符串中找到第 K 个字符。
-
查找原字符串中的索引:
- 在原字符串中查找第 K 个字符第一次出现的位置。
详细步骤
-
读取输入:
- 读取一行输入,包含一个字符串和一个整数
K
。
- 读取一行输入,包含一个字符串和一个整数
-
排序:
- 将字符串中的字符分为大写字母和小写字母。
- 分别对大写字母和小写字母进行排序。
- 将排序后的大写字母和小写字母拼接成一个新的字符串。
-
查找第 K 个字符:
- 在排序后的字符串中,找到第 K 个字符。
-
查找原字符串中的索引:
- 在原字符串中,从左到右查找第 K 个字符第一次出现的位置。
用例解释
用例 1
- 输入:
hAkDAjByBq 4
- 输出:
6
解释:
- 原字符串:
hAkDAjByBq
- 排序后的字符串:
AABBDhjkqy
- 第 4 个字符是
B
- 在原字符串中,
B
第一次出现的位置是 6
通过上述步骤,我们可以高效地找到排好序后的第 K 个字符在原字符串中的索引。这种方法的时间复杂度主要由排序操作决定,为 O(n log n)
,其中 n
是字符串的长度。查找操作的时间复杂度为 O(n)
。
二、JavaScript算法源码
以下是 JavaScript 代码的详细中文注释和逻辑讲解:
JavaScript 代码
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline"); // 引入 readline 模块,用于读取控制台输入// 创建 readline 接口
const rl = readline.createInterface({input: process.stdin, // 输入流为标准输入output: process.stdout, // 输出流为标准输出
});// 监听 'line' 事件,当用户输入一行内容时触发
rl.on("line", (line) => {// 将输入行按空格分割成数组const [str, idx] = line.split(" ");// 将字符串 str 转换为字符数组,排序后获取第 idx - 1 个字符const ele = [...str].sort()[idx - 1];// 输出该字符在原字符串 str 中的索引位置console.log(str.indexOf(ele));
});
代码逻辑讲解
1. 输入处理
- 使用
readline
模块读取控制台输入。 - 监听
line
事件,当用户输入一行内容时触发回调函数。 - 将输入行按空格分割成数组
[str, idx]
:str
是输入的字符串。idx
是输入的索引值(字符串形式)。
2. 排序并获取指定字符
- 将字符串
str
转换为字符数组:- 使用扩展运算符
...
将字符串拆分为字符数组。 - 例如,
"hello"
转换为["h", "e", "l", "l", "o"]
。
- 使用扩展运算符
- 对字符数组进行排序:
- 使用
sort()
方法按字典序排序。 - 例如,
["h", "e", "l", "l", "o"]
排序后为["e", "h", "l", "l", "o"]
。
- 使用
- 获取排序后的第
idx - 1
个字符:- 由于数组索引从
0
开始,所以需要idx - 1
。 - 例如,
idx = 2
,则获取["e", "h", "l", "l", "o"][1]
,即"h"
。
- 由于数组索引从
3. 查找字符在原字符串中的索引
- 使用
indexOf()
方法查找字符ele
在原字符串str
中的索引位置。- 例如,
str = "hello"
,ele = "h"
,则str.indexOf("h")
返回0
。
- 例如,
4. 输出结果
- 使用
console.log()
输出字符在原字符串中的索引位置。
代码细节解析
1. readline
模块
- 用于逐行读取控制台输入。
createInterface()
方法创建一个接口对象,绑定输入流和输出流。rl.on("line", callback)
监听用户输入,每次输入一行时触发回调函数。
2. split()
方法
- 将字符串按空格分割成数组。
- 例如,
"hello 2"
分割为["hello", "2"]
。
3. ...
扩展运算符
- 将字符串拆分为字符数组。
- 例如,
..."hello"
转换为["h", "e", "l", "l", "o"]
。
4. sort()
方法
- 对数组按字典序排序。
- 例如,
["h", "e", "l", "l", "o"]
排序后为["e", "h", "l", "l", "o"]
。
5. indexOf()
方法
- 返回字符在字符串中第一次出现的索引位置。
- 如果字符不存在,返回
-1
。 - 例如,
"hello".indexOf("h")
返回0
。
示例运行
输入
hello 2
步骤解析
- 输入字符串
"hello 2"
。 - 分割为
["hello", "2"]
。 - 将
"hello"
转换为字符数组["h", "e", "l", "l", "o"]
。 - 排序后为
["e", "h", "l", "l", "o"]
。 - 获取第
2 - 1 = 1
个字符"h"
。 - 查找
"h"
在原字符串"hello"
中的索引位置0
。 - 输出结果:
0
。
总结
- 功能:根据输入的字符串和索引值,找到排序后的指定字符在原字符串中的索引位置。
- 适用场景:处理字符串排序和索引查找问题。
- 注意事项:
- 如果输入的索引值超出范围(例如大于字符串长度),会导致
undefined
错误。 - 如果字符在原字符串中不存在,
indexOf()
返回-1
。
- 如果输入的索引值超出范围(例如大于字符串长度),会导致
如果有其他问题,欢迎随时提问!
三、Java算法源码
以下是 Java 代码的详细中文注释和逻辑讲解:
Java 代码
import java.util.Arrays; // 导入 Arrays 工具类,用于数组排序
import java.util.Scanner; // 导入 Scanner 类,用于读取控制台输入public class Main {// 主方法,程序入口public static void main(String[] args) {Scanner sc = new Scanner(System.in); // 创建 Scanner 对象,用于读取输入String str = sc.next(); // 读取输入的字符串int idx = sc.nextInt(); // 读取输入的索引值System.out.println(getResult(str, idx)); // 调用 getResult 方法并输出结果}// 算法入口,计算排序后指定索引字符在原字符串中的位置public static int getResult(String str, int idx) {char[] sArr = str.toCharArray(); // 将字符串转换为字符数组Arrays.sort(sArr); // 对字符数组按字典序排序char target = sArr[idx - 1]; // 获取排序后的第 idx - 1 个字符return str.indexOf(target); // 返回该字符在原字符串中的索引位置}
}
代码逻辑讲解
1. 输入处理
- 使用
Scanner
类读取控制台输入。sc.next()
读取一个字符串(以空格或换行符分隔)。sc.nextInt()
读取一个整数。
- 例如,输入
"hello 2"
:str = "hello"
。idx = 2
。
2. 字符数组排序
- 将字符串
str
转换为字符数组sArr
:- 使用
toCharArray()
方法。 - 例如,
"hello"
转换为['h', 'e', 'l', 'l', 'o']
。
- 使用
- 对字符数组
sArr
进行排序:- 使用
Arrays.sort()
方法按字典序排序。 - 例如,
['h', 'e', 'l', 'l', 'o']
排序后为['e', 'h', 'l', 'l', 'o']
。
- 使用
3. 获取目标字符
- 从排序后的字符数组
sArr
中获取第idx - 1
个字符:- 由于数组索引从
0
开始,所以需要idx - 1
。 - 例如,
idx = 2
,则获取['e', 'h', 'l', 'l', 'o'][1]
,即'h'
。
- 由于数组索引从
4. 查找字符在原字符串中的索引
- 使用
indexOf()
方法查找字符target
在原字符串str
中的索引位置。- 例如,
str = "hello"
,target = 'h'
,则str.indexOf('h')
返回0
。
- 例如,
5. 输出结果
- 使用
System.out.println()
输出字符在原字符串中的索引位置。
代码细节解析
1. Scanner
类
- 用于读取控制台输入。
next()
方法读取一个字符串(以空格或换行符分隔)。nextInt()
方法读取一个整数。
2. toCharArray()
方法
- 将字符串转换为字符数组。
- 例如,
"hello"
转换为['h', 'e', 'l', 'l', 'o']
。
3. Arrays.sort()
方法
- 对数组按字典序排序。
- 例如,
['h', 'e', 'l', 'l', 'o']
排序后为['e', 'h', 'l', 'l', 'o']
。
4. indexOf()
方法
- 返回字符在字符串中第一次出现的索引位置。
- 如果字符不存在,返回
-1
。 - 例如,
"hello".indexOf('h')
返回0
。
示例运行
输入
hello 2
步骤解析
- 输入字符串
"hello 2"
。 - 读取
str = "hello"
,idx = 2
。 - 将
"hello"
转换为字符数组['h', 'e', 'l', 'l', 'o']
。 - 排序后为
['e', 'h', 'l', 'l', 'o']
。 - 获取第
2 - 1 = 1
个字符'h'
。 - 查找
'h'
在原字符串"hello"
中的索引位置0
。 - 输出结果:
0
。
总结
- 功能:根据输入的字符串和索引值,找到排序后的指定字符在原字符串中的索引位置。
- 适用场景:处理字符串排序和索引查找问题。
- 注意事项:
- 如果输入的索引值超出范围(例如大于字符串长度),会导致数组越界异常。
- 如果字符在原字符串中不存在,
indexOf()
返回-1
。
如果有其他问题,欢迎随时提问!
四、Python算法源码
以下是 Python 代码的详细中文注释和逻辑讲解:
Python 代码
# 输入获取
s, i = input().split() # 读取输入的一行内容,按空格分割为字符串 s 和索引 i# 算法入口
def getResult():sArr = list(s) # 将字符串 s 转换为字符列表sArr.sort() # 对字符列表按字典序排序tar = sArr[int(i) - 1] # 获取排序后的第 int(i) - 1 个字符return s.find(tar) # 返回该字符在原字符串 s 中的索引位置# 算法调用
print(getResult()) # 调用 getResult 方法并输出结果
代码逻辑讲解
1. 输入处理
- 使用
input().split()
读取控制台输入的一行内容,并按空格分割为两个部分:s
:输入的字符串。i
:输入的索引值(字符串形式)。
- 例如,输入
"hello 2"
:s = "hello"
。i = "2"
。
2. 字符列表排序
- 将字符串
s
转换为字符列表sArr
:- 使用
list(s)
方法。 - 例如,
"hello"
转换为['h', 'e', 'l', 'l', 'o']
。
- 使用
- 对字符列表
sArr
进行排序:- 使用
sort()
方法按字典序排序。 - 例如,
['h', 'e', 'l', 'l', 'o']
排序后为['e', 'h', 'l', 'l', 'o']
。
- 使用
3. 获取目标字符
- 从排序后的字符列表
sArr
中获取第int(i) - 1
个字符:- 由于列表索引从
0
开始,所以需要int(i) - 1
。 - 例如,
i = "2"
,则获取['e', 'h', 'l', 'l', 'o'][1]
,即'h'
。
- 由于列表索引从
4. 查找字符在原字符串中的索引
- 使用
find()
方法查找字符tar
在原字符串s
中的索引位置。- 例如,
s = "hello"
,tar = 'h'
,则s.find('h')
返回0
。
- 例如,
5. 输出结果
- 使用
print()
输出字符在原字符串中的索引位置。
代码细节解析
1. input().split()
- 读取控制台输入的一行内容,并按空格分割为列表。
- 例如,输入
"hello 2"
,分割为["hello", "2"]
。
2. list(s)
- 将字符串转换为字符列表。
- 例如,
"hello"
转换为['h', 'e', 'l', 'l', 'o']
。
3. sort()
- 对列表按字典序排序。
- 例如,
['h', 'e', 'l', 'l', 'o']
排序后为['e', 'h', 'l', 'l', 'o']
。
4. find()
- 返回字符在字符串中第一次出现的索引位置。
- 如果字符不存在,返回
-1
。 - 例如,
"hello".find('h')
返回0
。
示例运行
输入
hello 2
步骤解析
- 输入字符串
"hello 2"
。 - 分割为
s = "hello"
,i = "2"
。 - 将
"hello"
转换为字符列表['h', 'e', 'l', 'l', 'o']
。 - 排序后为
['e', 'h', 'l', 'l', 'o']
。 - 获取第
2 - 1 = 1
个字符'h'
。 - 查找
'h'
在原字符串"hello"
中的索引位置0
。 - 输出结果:
0
。
总结
- 功能:根据输入的字符串和索引值,找到排序后的指定字符在原字符串中的索引位置。
- 适用场景:处理字符串排序和索引查找问题。
- 注意事项:
- 如果输入的索引值超出范围(例如大于字符串长度),会导致列表越界异常。
- 如果字符在原字符串中不存在,
find()
返回-1
。
如果有其他问题,欢迎随时提问!
五、C/C++算法源码:
以下是 C++ 代码的详细中文注释和逻辑讲解:
C++ 代码
#include <iostream> // 包含输入输出流库
#include <algorithm> // 包含算法库,用于排序
#include <string> // 包含字符串库using namespace std; // 使用标准命名空间// 算法入口
int getResult(string s, int i) {// 将字符串 s 转换为字符数组char sArr[s.length()];for (int j = 0; j < s.length(); j++) {sArr[j] = s[j];}// 对字符数组按字典序排序sort(sArr, sArr + s.length());// 获取排序后的第 i - 1 个字符char tar = sArr[i - 1];// 返回该字符在原字符串 s 中的索引位置return s.find(tar);
}int main() {// 输入获取string s;int i;cin >> s >> i; // 读取输入的字符串和索引值// 算法调用cout << getResult(s, i) << endl; // 调用 getResult 方法并输出结果return 0;
}
代码逻辑讲解
1. 输入处理
- 使用
cin
读取控制台输入:cin >> s
读取一个字符串。cin >> i
读取一个整数。
- 例如,输入
"hello 2"
:s = "hello"
。i = 2
。
2. 字符数组排序
- 将字符串
s
转换为字符数组sArr
:- 使用循环将字符串的每个字符赋值给字符数组。
- 例如,
"hello"
转换为['h', 'e', 'l', 'l', 'o']
。
- 对字符数组
sArr
进行排序:- 使用
sort()
函数按字典序排序。 - 例如,
['h', 'e', 'l', 'l', 'o']
排序后为['e', 'h', 'l', 'l', 'o']
。
- 使用
3. 获取目标字符
- 从排序后的字符数组
sArr
中获取第i - 1
个字符:- 由于数组索引从
0
开始,所以需要i - 1
。 - 例如,
i = 2
,则获取['e', 'h', 'l', 'l', 'o'][1]
,即'h'
。
- 由于数组索引从
4. 查找字符在原字符串中的索引
- 使用
find()
方法查找字符tar
在原字符串s
中的索引位置。- 例如,
s = "hello"
,tar = 'h'
,则s.find('h')
返回0
。
- 例如,
5. 输出结果
- 使用
cout
输出字符在原字符串中的索引位置。
代码细节解析
1. cin
- 用于读取控制台输入。
cin >> s
读取一个字符串(以空格或换行符分隔)。cin >> i
读取一个整数。
2. 字符数组
- 使用
char sArr[s.length()]
定义字符数组。 - 使用循环将字符串的每个字符赋值给字符数组。
3. sort()
- 对数组按字典序排序。
- 例如,
['h', 'e', 'l', 'l', 'o']
排序后为['e', 'h', 'l', 'l', 'o']
。
4. find()
- 返回字符在字符串中第一次出现的索引位置。
- 如果字符不存在,返回
string::npos
(通常为-1
)。 - 例如,
"hello".find('h')
返回0
。
示例运行
输入
hello 2
步骤解析
- 输入字符串
"hello 2"
。 - 读取
s = "hello"
,i = 2
。 - 将
"hello"
转换为字符数组['h', 'e', 'l', 'l', 'o']
。 - 排序后为
['e', 'h', 'l', 'l', 'o']
。 - 获取第
2 - 1 = 1
个字符'h'
。 - 查找
'h'
在原字符串"hello"
中的索引位置0
。 - 输出结果:
0
。
总结
- 功能:根据输入的字符串和索引值,找到排序后的指定字符在原字符串中的索引位置。
- 适用场景:处理字符串排序和索引查找问题。
- 注意事项:
- 如果输入的索引值超出范围(例如大于字符串长度),会导致数组越界异常。
- 如果字符在原字符串中不存在,
find()
返回string::npos
(通常为-1
)。
如果有其他问题,欢迎随时提问!