描述
找到给定数组的给定区间内的第K小的数值。
输入
输入第一行为用例个数, 每个测试用例输入的第一行为数组,每一个数用空格隔开;
第二行是区间(第几个数到第几个数,两头均包含),两个值用空格隔开;
第三行为K值。
输出
第k小的那个数
输入样例 1
1
1 2 3 4 5 6 7
3 5
2
输出样例 1
4
实现
import java.util.Arrays;
import java.util.Scanner;
public class NoKSmallOfInterval {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int numOfCases = Integer.parseInt(scanner.nextLine()); // 测试用例数量 // 若使用nextInt()会使下一个nextLine()出错
// 对每个测试用例的处理
for (int i = 0; i < numOfCases; i++) {
// 获取要处理的数字数组,并放入int[]中
String[] temp1 = scanner.nextLine().split(" ");
int maxLenOfArr = temp1.length; // 数组数字数量 或 数组最大长度
int[] numArray = new int[maxLenOfArr];
for (int j = 0; j < maxLenOfArr; j++) {
numArray[j] = Integer.parseInt(temp1[j]);
}
// 获取要查找的区间的范围
String[] temp2 = scanner.nextLine().split(" ");
int start = Integer.parseInt(temp2[0]) - 1; // -1为了把第几个转化为数组下标
int end = Integer.parseInt((temp2[1])); // end不减是因为sort()函数toIndex是终结位置+1
// 获取k值
int k = Integer.parseInt(scanner.nextLine());
// 调用方法并输出结果
System.out.println(getNoKSmall(numArray, start, end, k));
}
scanner.close();
}
// 获取区间第k小的数
public static int getNoKSmall(int[] numArray, int start, int end, int k) {
Arrays.sort(numArray, start, end); // 排序降低时间复杂度
return numArray[start + k - 1];
}
}