Java日常练习题,每天进步一点点(12) - 完整攻略
本题目需要求出给定一组数字中的前k大的数,并进行排序输出。下面是完成此任务的完整攻略:
题目分析
首先,我们需要清楚题目的要求——给定一组数字,求前k大的数并进行排序输出。因此,我们需要以下步骤:
- 读取输入数字列表;
- 求出前k大的数字;
- 将前k大的数字进行排序(从大到小);
- 输出排序后的前k大数字。
下面我们将为您详细解析这四步。
读取数字列表
首先需要读取一组数字列表,这可以通过Java中的Scanner类实现。示例代码如下:
Scanner sc = new Scanner(System.in);
System.out.println("请输入一组数字,每个数字用空格隔开");
String line = sc.nextLine();
String[] numsStrs = line.split(" ");
int[] nums = new int[numsStrs.length];
for (int i = 0; i < numsStrs.length; i++) {
nums[i] = Integer.parseInt(numsStrs[i]);
}
解释一下这段代码的功能。首先,我们创建一个Scanner对象,并从标准输入读取一行字符串line,该字符串包含以空格分隔的整数。接着,我们使用line.split(" ")方法,将line字符串按照空格切分出每一个数字字符串。接着,我们使用for循环遍历切分出来的字符串数组,并使用Integer.parseInt方法将字符串转成int类型,并存入nums数组中。
求出前k大的数字
接下来,我们需要求出前k大的数字。我们可以使用Java中的PriorityQueue实现。PriorityQueue是一个优先队列,其元素通过一个比较器来进行排序。在本例中,我们需要求出前k大的数,因此需要将PriorityQueue的大小设置为k,让其中只保留前k大的元素。示例代码如下:
int k = 3; // 以3为例
PriorityQueue<Integer> queue = new PriorityQueue<>(k, Collections.reverseOrder());
for (int num : nums) {
queue.offer(num);
if (queue.size() > k) {
queue.poll();
}
}
首先我们声明了一个变量k,作为求前k大数字的参数,这里我们以k=3为例进行说明。然后我们创建了一个大小为k的PriorityQueue,采用逆序比较器。接着,我们遍历nums数组中的所有数字,将其分别加入PriorityQueue中。如果PriorityQueue的大小超过了k,则将优先队列中队首元素(即队列中最小的元素)弹出,这样保证了队列中只保留前k大的数字。运行结束后,队列中最小的数字就是前k大数字中最小的那个,而队列中其余数字均为前k大的数字。接下来,我们需要将前k大数字排序并输出。
排序前k大数字
从PriorityQueue中取出前k大数字后,我们需要将这些数字进行排序。我们可以使用Arrays.sort方法对前k大数字进行排序,这里我们采用逆序排序(即从大到小排序)。示例代码如下:
Integer[] topK = new Integer[k];
queue.toArray(topK);
Arrays.sort(topK, Collections.reverseOrder());
通过上面代码,我们将PriorityQueue中的数据拷贝到了一个数组topK中,然后对topK数组进行逆序排序。
输出前k大数字
最后,我们需要将前k大数字输出。示例代码如下:
System.out.println("前" + k + "大数字为:");
for (int num : topK) {
System.out.print(num + " ");
}
运行上面代码,即可输出前k大数字。
示例
下面是一个完整的示例:
import java.util.*;
public class TopKSort {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一组数字,每个数字用空格隔开");
String line = sc.nextLine();
String[] numsStrs = line.split(" ");
int[] nums = new int[numsStrs.length];
for (int i = 0; i < numsStrs.length; i++) {
nums[i] = Integer.parseInt(numsStrs[i]);
}
int k = 3; // 求前3大的数
PriorityQueue<Integer> queue = new PriorityQueue<>(k, Collections.reverseOrder());
for (int num : nums) {
queue.offer(num);
if (queue.size() > k) {
queue.poll();
}
}
Integer[] topK = new Integer[k];
queue.toArray(topK);
Arrays.sort(topK, Collections.reverseOrder());
System.out.println("前" + k + "大数字为:");
for (int num : topK) {
System.out.print(num + " ");
}
}
}
输入:“4 8 1 5 10 3 6 2”
输出:
前3大数字为:
10 8 6
希望本攻略能够帮助你解答本题,也欢迎留言讨论QAQ。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java日常练习题,每天进步一点点(12) - Python技术站