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日

相关文章

  • 更改Mysql数据库存储位置的具体步骤

    更改Mysql数据库存储位置的具体步骤如下: 步骤一:备份原有数据库 在操作之前,我们需要先备份原有的数据库文件,防止出现意外情况导致数据丢失。可以使用mysqldump命令进行备份,命令格式如下: mysqldump -u root -p –default-character-set=utf8 数据库名 > 备份文件.sql 其中,-u指定用户名,…

    C 2023年5月23日
    00
  • 如何通过C++求出链表中环的入口结点

    1. 环的入口结点(题目描述) 给定一个链表,返回链表中环的入口结点。如果链表无环,则返回 NULL。 要求算法的空间复杂度为 O(1)。 2. 思路分析 这道题可以使用双指针法(快慢指针)来解决。 具体的思路为:首先,设定两个指针,分别为 fast 和 slow,然后,让它们以不同的速度往前走(fast 比 slow 快),这样,当两个指针重合时,就表示链…

    C 2023年5月23日
    00
  • C标准库 assert.h

    assert.h 是C标准库中的一个头文件,该文件定义了一组标准的宏用来检测程序中的逻辑错误。assert.h 的使用可以极大地方便程序的开发与调试,下面我们就来详细讲解 assert.h 的完整使用攻略。 assert.h 的引入 在需要使用 assert.h 的源文件开头处,可以使用以下代码进行引入: #include <assert.h> …

    C 2023年5月10日
    00
  • IE浏览器无法打开搜索页的详细解决方法以及常用文件打不开的解决方法

    问题描述: 有时我们会遇到在IE浏览器中无法打开搜索页或者常用的文件打不开的问题,造成这个问题通常有以下几个原因: IE浏览器设置问题; 操作系统缺少必要的组件或者文件关联出现问题; 系统文件被病毒或者恶意软件感染导致异常等问题。 解决方法: 解决IE浏览器无法打开搜索页的方法 步骤一:清空IE浏览器缓存和Cookie 在IE浏览器中点击菜单栏的“工具”按钮…

    C 2023年5月23日
    00
  • C语言实现稀疏矩阵

    C语言实现稀疏矩阵的完整攻略 1、什么是稀疏矩阵? 稀疏矩阵是矩阵中绝大部分元素为0的矩阵。相对于密集矩阵,稀疏矩阵可以用更少的存储空间来存储矩阵中的数据。 2、如何实现稀疏矩阵? 2.1 稀疏矩阵的三元组存储法 稀疏矩阵的三元组存储法是最常用的矩阵存储方法之一。其基本思路是:将矩阵中的非零元素及其对应的行列下标存储起来,对于未存储的元素,默认其值为0。具体…

    C 2023年5月23日
    00
  • C++如何通过ostringstream实现任意类型转string

    使用ostringstream可以方便地将任意类型转换成string类型。下面是具体的攻略: 步骤一:引入头文件 首先需要引入头文件<sstream>,因为ostringstream类定义在这个头文件中。 #include <sstream> 步骤二:定义一个ostringstream对象 ostringstream oss; 定义一…

    C 2023年5月23日
    00
  • java的JsonObject对象提取值方法

    下面是详细的解释和示例: 1. JsonObject对象提取值的方法 在Java语言中可以使用Json库来处理JSON格式的数据,其中处理JsonObject对象是非常常见的操作,经常需要从这个对象中提取指定的数据。 对于JsonObject对象,我们可以使用get()方法来获取其中的指定属性值,其中的参数为要获取的属性名,如果对应属性不存在,会返回null…

    C 2023年5月23日
    00
  • C语言实现简单计算器程序

    C语言实现简单计算器程序 实现一个简单的计算器程序可以帮助我们更好地理解C语言的基本语法和逻辑思维方式。下面给出完整的攻略。 步骤一:设计计算器程序 首先,我们需要明确计算器程序的功能和界面。 本程序需要实现以下功能: 支持加、减、乘、除四种基本运算 支持整数和小数的运算 支持多次运算 支持清空和退出功能 程序界面可以设计成如下形式: ===========…

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