Java日常练习题,每天进步一点点(12)

Java日常练习题,每天进步一点点(12) - 完整攻略

本题目需要求出给定一组数字中的前k大的数,并进行排序输出。下面是完成此任务的完整攻略:

题目分析

首先,我们需要清楚题目的要求——给定一组数字,求前k大的数并进行排序输出。因此,我们需要以下步骤:

  1. 读取输入数字列表;
  2. 求出前k大的数字;
  3. 将前k大的数字进行排序(从大到小);
  4. 输出排序后的前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技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C/C++百行代码实现热门游戏消消乐功能的示例代码

    C/C++百行代码实现热门游戏消消乐功能的示例代码攻略 简介 消消乐是一款非常流行的益智游戏,其核心游戏玩法是三消规则,在有限的步数内将相同颜色(或形状)的方块消除。本文将通过C/C++语言编写少于100行代码来实现消消乐游戏功能。 实现步骤 第一步:定义方块 我们需要定义游戏中的方块,方块应该包含颜色、形状以及消除状态等属性。具体实现如下: struct …

    C 2023年5月24日
    00
  • 如何统计在一篇文章中某个单词出现了几次,以及第一次出现的位置

    以下是一个完整的攻略,用于统计一篇文章中某个单词出现的次数和第一次出现的位置。 1. 获取文本数据 首先,需要从文章中获取文本数据。如果文章已经存储在文件中,可以使用文件读取函数来获取文本数据。如果文章存储在数据库中,可以使用数据库查询功能来获取文本数据。在这里,我们假设文本数据已经被保存到一个字符串变量中,并且该变量名为text。 2. 统计单词出现次数 …

    C 2023年5月23日
    00
  • 解析Linux下的时间函数:设置以及获取时间的方法

    解析Linux下的时间函数: 设置以及获取时间的方法 在Linux系统中,我们经常需要获取当前时间,或者将时间设置为指定的值。本文将介绍Linux系统下获取和设置时间的相关函数以及用法。 获取当前时间 在Linux系统下,我们可以使用time()函数获取当前“时间戳”,即从1970年1月1日0时0分0秒(UTC)起到现在的秒数。 #include <s…

    C 2023年5月23日
    00
  • C语言中的函数指针学习笔记

    现在为大家介绍一下“C语言中的函数指针学习笔记”的完整攻略。 什么是函数指针? 函数指针(Function Pointer)是指向函数的指针变量,也就是说,函数指针指向函数的入口地址。 函数指针的定义 函数指针的定义格式如下: typedef int (*func_ptr)(int, int); // func_ptr是一个函数指针类型 上面代码定义了一个名…

    C 2023年5月24日
    00
  • Basic求10000以内的完美数

    下面是 “Basic求10000以内的完美数” 的完整攻略: 任务描述 在Basic语言中,编写代码搜索10000以内的所有完美数并输出。 任务分析 完美数是指一个数等于其自身所有因子(不包括自己)之和,例如:6就是完美数,它的因子为1、2、3,而1 + 2 + 3正好等于6。因此,我们可以采用以下方法来寻找10000以内的完美数: 遍历1~10000之间的…

    C 2023年5月22日
    00
  • C++ 数据结构之水洼的数量算法

    C++ 数据结构之水洼的数量算法 问题描述 有一个矩阵区域,其中包含了若干个“水洼”,每个水洼是由相邻的“水滴”组成的区域。其中,相邻的“水滴”指的是上下左右四个方向上位置相邻的“.”,而不是斜对角线方向。 例如,下面的矩阵区域中,连续的“.”就构成了两个水洼: X . . X . X . . X . . X X . . . . . X . 现在,给定一个这…

    C 2023年5月22日
    00
  • 详解如何将Spire.XLS for C++集成到C++程序中

    首先,我们需要下载并安装Spire.XLS for C++。在官网上下载 .zip 文件并解压缩,可以找到以下文件和文件夹: bin/ include/ lib/ README.txt 其中,bin/ 包含库和头文件,include/ 包含头文件,lib/ 包含库文件。 第一步,设置编译器的头文件路径和库文件路径。以 Visual Studio 为例,右键项…

    C 2023年5月23日
    00
  • C语言怎么获得进程的PE文件信息

    要获取进程的PE文件信息,可以使用Windows的API函数和一些常用的数据结构。 首先需要使用OpenProcess函数打开目标进程,该函数会返回目标进程的句柄,用于后续的操作。然后再使用GetModuleInformation函数获取目标进程的所有模块信息,包括PE文件的基址、大小等信息。最后需要使用CloseHandle关闭进程句柄以释放资源。 以下是…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部