【华为OD题库-071】字符串筛选排序-java

题目

输入一个由n个大小写字母组成的字符串,按照Ascii码值从小到大的排序规则,查找字符串一中第k个最小ascii码值的字母(k>= 1),输出该字母所在字符串的位置索引(字符串的第一个字符位置索引为0)。
k如果大于字符串长度,则输出最大ascii值的字母所在字符串的位置索引,如果有重复的字母,则输出字母的最小位置索引。
输入描述:
第一行输入一个由大小写字母组成的字符串
第二行输入k,k必须大于0,k可以大于输入字符串的长度
输出描述:
输出字符串中第k个最小 ascii码值的字母所在字符串的位置索引。k如果大于字符串长度,则输出最大ascii值的字母所在字符串的位置索引,如果第k个最小ascii码值的字母存在重复,则输出该字母的最小位置索引。
示例1:
输入
AbCdeFG
3
输出
5
说明:
根据ASCII码值排序,第三个ASCII码值的字母为F,F在字符串中位置索引为5(0为字符串的第一个字母位置索引)
示例2:
输入:
fAdDAkBbBq
4
输出:
6
说明:
根据ASCII码值排序前4个字母为AABB由于B重复则只取B的第一个最小位置索引6,而不是第二个B的位置索引8

思路

将输入按照ascii码升序,索引升序排序,取第k个值的索引即可
如果k大于输入字符串长度,k等于str.length
如果取到的字符有多个,则找到最前面的那个(索引最小)

题解

package hwod;

import java.util.*;

public class StringSort {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        int n = sc.nextInt();
        System.out.println(stringSort(str, n));
    }

    // 按ascii码升序,索引升序排序
    private static int stringSort(String str, int k) {
        char[] chars = str.toCharArray();
        k=Math.min(str.length(),k);
        k--;
        List<int[]> list = new ArrayList<>();
        for (int i = 0; i < chars.length; i++) {
            list.add(new int[]{chars[i], i});
        }
        list.sort((o1, o2) -> {
            if (o1[0] != o2[0]) return o1[0] - o2[0];
            return o1[1] - o2[1];
        });
        //找到最前面的相同值
        int j = k - 1;
        while (j >= 0 && list.get(j)[0] == list.get(k)[0]) {
            j--;
        }
        return list.get(j + 1)[1];


    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

你可能感兴趣的:(华为OD题库JAVA题解,华为od,java)