【华为OJ】【040-输入n个整数,输出其中最小的k个】
来源:互联网 发布:淘宝心选在哪里显示 编辑:程序博客网 时间:2024/06/08 13:45
【华为OJ】【算法总篇章】
【华为OJ】【040-输入n个整数,输出其中最小的k个】
【工程下载】
题目描述
输入n个整数,输出其中最小的k个。
输入描述
输入说明 1 输入两个整数 2 输入一个整数数组
输出描述
输出一个整数数组
输入例子
5 21 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; }}
2 0
- 【华为OJ】【040-输入n个整数,输出其中最小的k个】
- [华为OJ--C++]040-输入n个整数,输出其中最小的k个
- 【华为OJ】输入n个整数,输出其中最小的k个
- 华为oj: 输入n个整数,输出其中最小的k个
- 华为OJ试题:输入n个整数,输出其中最小的k个
- 华为OJ基础篇-输入n个整数,输出其中最小的k个
- 华为oj输入n个整数,输出其中最小的k个
- 华为oj 输入n个整数,输出其中最小的k个
- 华为OJ题目(二十一):输入n个整数,输出其中最小的k个
- 华为OJ——输入n个整数,输出其中最小的k个
- 华为OJ 初级:输入n个整数,输出其中最小的k个
- 华为OJ——输入n个整数,输出其中最小的k个
- 【华为OJ】输入n个整数,输出其中最小的k个
- 华为OJ——输入n个整数,输出其中最小的k个
- 华为oj初级 输入n个整数,输出其中最小的k个
- 华为OJ——输入n个整数,输出其中最小的k个
- 输入n个整数,输出其中最小的k个——来自华为OJ平台测试基础篇
- 华为OJ平台试题 —— 数组:输入n个整数,输出其中最小的k个
- MAGENTO调试 打开错误报告的几种方式
- HTTP POST请求报文格式分析与Java实现文件上传
- Android中自定义MultipartEntity实现文件上传以及使用Volley库实现文件上传
- 【华为OJ】【039-无线OSS-高精度整数加法】
- could not instantiate class [xxx] from tuple
- 【华为OJ】【040-输入n个整数,输出其中最小的k个】
- C语言获取随机数
- Android 解决ListView 和 ScrollView 共存冲突的问题
- 在C语言头文件中“”与<>有什么区别?
- C语言函数的递归调用
- 第7周 C语言及程序设计提高例程-25 指针作函数参数
- android 之将自己的自定义组件打包成JAR包
- C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈
- <读书笔记>软件调试之道 :问题的核心-诊断