华为OJ平台——输出最小的k个数
输入n个整数,输出其中最小的k个。
详细描述:
接口说明
原型:
bool GetMinK(unsignedint uiInputNum, int *pInputArray, unsignedint uiK, int * pOutputArray);
输入参数:
unsignedint uiInputNum //输入整数个数
int * pInputArray //输入整数数组
unsignedint uiK //需输出uiK个整数
输出参数(指针指向的内存区域保证有效):
int * pOutputArray //最小的uiK个整数
练习阶段: 初级
运行时间限制: 10Sec
内存限制: 128MByte
输入:
输入说明
1 输入两个整数
2 输入一个整数数组
输出:
输出一个整数数组
样例输入: 5 2
1 3 5 7 2
样例输出: 1 2
分值:100分
代码如下:
1 import java.util.Scanner; 2 3 /** 4 * 输入n个整数,输出k个最小的 5 * @author keli 6 * 7 */ 8 public class GetKSmaller { 9 10 public static void main(String[] args) { 11 //输入 12 Scanner cin = new Scanner(System.in) ; 13 int n = cin.nextInt() ; 14 int k = cin.nextInt() ; 15 int [] arr = new int[n] ; 16 for(int i = 0 ; i < n ; i++){ 17 arr[i] = cin.nextInt() ; 18 } 19 cin.close(); 20 //简单的错误判断 21 if(k > n){ 22 System.out.println("error"); 23 } 24 //获取结果 25 int [] res = new int[k] ; 26 getMinK(n,arr,k,res) ; 27 //输出 28 for(int i = 0 ; i < k-1 ; i++){ 29 System.out.print(res[i]+" ") ; 30 } 31 System.out.println(res[k-1]); 32 } 33 34 /** 35 * 找出最小的K个数,并按大小存储到res数组中 36 * @param n 37 * @param arr 38 * @param k 39 * @param res 40 */ 41 private static void getMinK(int n, int[] arr, int k, int [] res) { 42 //为了不改变原先的数据,所以将源数据复制过来 43 int [] newArr = new int[n] ; 44 for(int i = 0 ; i < n ; i ++){ 45 newArr[i] = arr[i] ; 46 } 47 48 //简单排序算法,对数据进行排序 49 int temp ; 50 int index ; 51 for(int i = 0 ; i < k ; i ++){ 52 temp = newArr[i] ; 53 index = i ; 54 for(int j = i+1 ; j < n ; j++){ 55 if(temp > newArr[j]){ 56 temp = newArr[j] ; 57 index = j ; 58 } 59 } 60 if(index != i){ 61 newArr[index] = newArr[i] ; 62 newArr[i] = temp ; 63 } 64 //将相应的数据存放到res数组中 65 res[i] = newArr[i] ; 66 } 67 } 68 69 }
其中非常值得注意的是华为的OJ平台的输出要求非常变态和死板,这种类型的输出只能是一个数后加一个空格(不能用Tab),然后最后一个数之后不能空格