一、题目描述
给定数字 0~9 各若干个。你可以任意顺序排列这些数字,但是必须全部使用。目标使得最后得到的数尽可能的小(注意0不能做首位)
例如:给定两个0,两个1,两个5,一个8,我们得到的最小的数就是 10015558;
输入描述
每输入包含一个测试用例,每个测试用例在一行中给出10个非负整数,
顺序表示我们拥有数字0,数字1、……数字9的个数。
整数间用个空格隔开。10个数总数不能超过50,但是至少有一个非零的数字。
输出描述
在一行输出能够组成的最小的数
二、思路分析
首先,根据输入的数(每一位都表示以下标表示的数有几个)得到结果中的全部数字;
再将这些数进行排序,如果第一个数是0的话,就往后找第一个不为零的数,和第一位数交换位置;
最后输出这一组数就可以了;
三、代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String s = sc.nextLine();
String[] split = s.split(" ");
int[] array = new int[split.length];
for(int i = 0; i < array.length; i++) {
array[i] = Integer.parseInt(split[i]);
}
String ret = func(array);
System.out.println(ret);
}
}
private static String func(int[] array) {
String ret = "";
int count = 0; // 结果数组的长度
for (int i = 0; i < array.length; i++) {
if(array[i] != 0) {
count = count + array[i];
}
}
int[] a = new int[count]; // 存放结果的数组
int b = 0;
for (int i = 0; i < array.length; i++) {
if (array[i] != 0) {
while (array[i] != 0 ) {
a[b++] = i;
array[i]--;
}
}
}
// 排序
Arrays.sort(a);
// 如果第一个数是 0,就往后找第一个不是零的数,和第一位数交换位置
if (a[0] == 0) {
for (int i = 1; i < count; i++) {
if (a[i] != 0) {
swap(a, 0, i);
break;
}
}
}
// 将结果数组转换成字符串
for (int i = 0; i < count; i++) {
ret = ret + a[i];
}
return ret;
}
private static void swap(int[] array, int i, int j) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}