【华为OJ】【040-输入n个整数,输出其中最小的k个】

【华为OJ】【算法总篇章】


【华为OJ】【040-输入n个整数,输出其中最小的k个】

【工程下载】


题目描述

输入n个整数,输出其中最小的k个。

输入描述

输入说明
1 输入两个整数
2 输入一个整数数组

输出描述

输出一个整数数组

输入例子

5 2
1 3 5 7 2

输出例子

1 2

算法实现

import java.util.Arrays;
import java.util.Scanner;

/**
 * Author: 王俊超
 * Date: 2015-12-24 18:57
 * Declaration: All Rights Reserved !!!
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
//        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            int k = scanner.nextInt();
            int[] arr = new int[n];

            for (int i = 0; i < n; i++) {
                arr[i] = scanner.nextInt();
            }

            // 【1】方法一
            System.out.print(getMinK(arr, k));

            // 【2】方法二
//            Arrays.sort(arr);
//            StringBuilder builder = new StringBuilder();
//            for (int i = 0; i < k; i++) {
//                builder.append(arr[i]).append(‘ ‘);
//            }
//
//            System.out.print(builder.substring(0, builder.length() - 1));
        }

        scanner.close();
    }

    private static String getMinK(int[] arr, int k) {

        if (k <= 0) {
            return "";
        } else if (k >= arr.length) {
            StringBuilder b = new StringBuilder();
            for (int i : arr) {
                b.append(i).append(‘ ‘);
            }

            return b.toString();
        } else {

            int[] min = new int[k];

            for (int i = 0; i < arr.length; i++) {
                if (i < k - 1) {
                    min[i] = arr[i];
                } else if (i == k - 1) {
                    min[i] = arr[i];

                    // 下面要建大堆了
                    for (int j = min.length / 2; j >= 0; j--) {
                        shiftDown(min, j, min.length);
                    }
                } else {
                    if (min[0] > arr[i]) {
                        min[0] = arr[i];
                        shiftDown(min, 0, min.length);
                    }
                }
            }

            Arrays.sort(min);

            StringBuilder b = new StringBuilder();
            for (int i : min) {
                b.append(i).append(‘ ‘);
            }
            return b.substring(0, b.length() - 1);
        }
    }

    private static void shiftDown(int[] a, int i, int n) {
        int child;
        int tmp;
        for (tmp = a[i]; 2 * i + 1 < n; i = child) {
            // 左孩子
            child = 2 * i + 1;
            // 找较大的子结点
            if (child + 1 < n && a[child] < a[child + 1]) {
                child++;
            }

            if (tmp < a[child]) {
                a[i] = a[child];
            } else {
                break;
            }
        }

        a[i] = tmp;
    }
}
时间: 2024-10-08 09:03:36

【华为OJ】【040-输入n个整数,输出其中最小的k个】的相关文章

华为OJ:查找输入整数二进制中1的个数

不得不说这道题就是一道十分蛋疼的题,我本来想着对输入的整数K对1按位与运算,然后再将K向右移一位,循环这样做,知道K为0. 万万没想到,程序一直超时,莫名其妙,看讨论上说是因为这编译器高位补零,还能不能再坑一点. import java.util.Scanner; public class binarySystemOneNumber { public static int findNumberOf1(int k){ int count=0; int num=1; for(int i=1;i<=I

[华为]输入n个整数,输出其中最小的k个

链接:https://www.nowcoder.com/questionTerminal/69ef2267aafd4d52b250a272fd27052c来源:牛客网 输入n个整数,输出其中最小的k个. 详细描述: 接口说明 原型: bool GetMinK(unsignedint uiInputNum, int * pInputArray, unsignedint uiK, int * pOutputArray); 输入参数: unsignedint uiInputNum //输入整数个数 i

排序,求几个最值问题,输入n个整数,输出其中最小的k个元素。

看完两个求最大值算法之后的一些感想. 如果想直接看算法的可以跳过.但是我觉得我这些想法还是比较有用的,至少对我将来的算法设计是这样的. 算法的功能越强大,必然意味着速度慢,因为根据丛林法则,那种慢又功能少的算法会被淘汰. 所以,(注意了!!),如果我们在使用一个算法的时候感觉到它造成的结果满足我们的使用,而且超出了,我们的使用,那么我们就很可能浪费了时间,降低了效率. 例如这个1000个数中求最大的10个的算法: 如果排序,取前10个.发现后面的白排序了,根本没用到.参照加粗行,也许可以有更快的

【任意输入一串整数输出该数的位数】新手每天学写C程序(1)

#include"stdio.h" int main() { int a; int n=0; scanf("%d",&a); n++; a=a/10; while(a>0) { n++; a=a/10; } printf("%d",n); return 0; } [任意输入一串整数输出该数的位数]新手每天学写C程序(1)

【华为OJ】【035-输出单向链表中倒数第k个结点】

[华为OJ][算法总篇章] [华为OJ][035-输出单向链表中倒数第k个结点] [工程下载] 题目描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 输入描述 输入说明 1 输入链表结点个数 2 输入链表的值 3 输入k的值 输出描述 输出一个整数 输入例子 8 1 2 3 4 5 6 7 8 4 输出例子 4 算法实现 import org.omg.SendingContext.RunTime; import java.util.List; import

[华为机试]输入一个正整数,输出2000年1月1日经过该整数天后的日期.

//输入一个正整数,输出2000年1月1日经过该整数天后的日期.已测试,输入值可以为0~1095727 //如,100天后,日期为2000 4 10 #include<stdio.h> #define MAX_YEAR 5000//年数可以从2000一直到4999年. //函数功能:求解第year年共有多少天 int day_in_year(int year) { if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400

用 java 编写程序实现输入4个整数输出4个整数的和

源代码: /*Duo Ya Fan*/ /*2015 9 23 */ /* 用于输入4个整数并输出4个整数的和*/  import java.util.*; public class JiSuan {    public static void main(String args[])   {       int count;//count用来表示第几个数       double next,sum;//next,sum 分别用来存放输入的4个整数和4个整数的和.       sum=0;//对s

输入n个整数,输出其中最小的k个

import java.util.Arrays; import java.util.Scanner; public class GetKSmallNum { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan = new Scanner(System.in); int num = scan.nextInt(); int out = scan.nextInt(); int

OJ刷题之《输入三个整数,按由小到大的顺序输出》

题目描述 输入三个整数,按由小到大的顺序输出.分别使用指针和引用方式实现两个排序函数.在主函数中输入和输出数据. 输入 三个整数 输出 由小到大输出成一行,每个数字后面跟一个空格.由指针方式实现. 由小到大输出成一行,每个数字后面跟一个空格.由引用方式实现. 样例输入 2 3 1 样例输出 1 2 3 1 2 3 提示 主函数已给定如下,提交时不需要包含下述主函数 /* C++代码 */ int main() { void sort1(int *,int *,int *); void sort2