输入n个数和一个整数K,输入n个数中第K个最大最小值。要求有输入错误判断及相应错误信息
时间: 2024-09-15 19:03:43 浏览: 26
要解决这个问题,我们可以先从用户输入开始,然后对输入的数进行排序,最后找到第K大的或第K小的数。这里我提供两种方法,一种是使用Java内置的排序功能,另一种是手动实现排序。
### 方法一:使用Java内置排序功能
```java
import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.Scanner;
public class KthLargestOrSmallest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入整数n:");
int n;
try {
n = scanner.nextInt();
if (n <= 0) {
throw new IllegalArgumentException("请输入一个正整数。");
}
int[] numbers = new int[n];
int k = 0;
System.out.println("请输入n个整数:");
for (int i = 0; i < n; i++) {
numbers[i] = scanner.nextInt();
}
System.out.println("请输入整数K:");
k = scanner.nextInt();
if (k <= 0 || k > n) {
throw new IllegalArgumentException("K必须为1到n之间的整数。");
}
int kthValue = findKthValue(numbers, k);
System.out.println("第" + k + "个最大值是:" + kthValue);
} catch (InputMismatchException e) {
System.out.println("输入错误,请输入有效的整数。");
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
} finally {
scanner.close();
}
}
private static int findKthValue(int[] numbers, int k) {
Arrays.sort(numbers);
return numbers[numbers.length - k];
}
}
```
### 方法二:手动实现快速排序
```java
import java.util.InputMismatchException;
import java.util.Scanner;
public class KthLargestOrSmallest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入整数n:");
int n;
try {
n = scanner.nextInt();
if (n <= 0) {
throw new IllegalArgumentException("请输入一个正整数。");
}
int[] numbers = new int[n];
int k = 0;
System.out.println("请输入n个整数:");
for (int i = 0; i < n; i++) {
numbers[i] = scanner.nextInt();
}
System.out.println("请输入整数K:");
k = scanner.nextInt();
if (k <= 0 || k > n) {
throw new IllegalArgumentException("K必须为1到n之间的整数。");
}
int kthValue = findKthValue(numbers, 0, numbers.length - 1, k);
System.out.println("第" + k + "个最大值是:" + kthValue);
} catch (InputMismatchException e) {
System.out.println("输入错误,请输入有效的整数。");
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
} finally {
scanner.close();
}
}
private static int findKthValue(int[] numbers, int left, int right, int k) {
if (left == right) {
return numbers[left];
}
int pivotIndex = partition(numbers, left, right);
if (k == pivotIndex + 1) {
return numbers[pivotIndex];
} else if (k < pivotIndex + 1) {
return findKthValue(numbers, left, pivotIndex - 1, k);
} else {
return findKthValue(numbers, pivotIndex + 1, right, k);
}
}
private static int partition(int[] numbers, int left, int right) {
int pivot = numbers[right];
int i = left;
for (int j = left; j < right; j++) {
if (numbers[j] > pivot) {
int temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
i++;
}
}
int temp = numbers[i];
numbers[i] = numbers[right];
numbers[right] = temp;
return i;
}
}
```
在这两种方法中,第一种方法更简洁,因为Java内置的`Arrays.sort()`方法可以快速对数组进行排序。第二种方法使用了快速排序算法的分区过程,虽然代码更复杂,但它在处理大数据集时可能更高效。