PAT 乙级 1023.组个最小数 C++/Java
给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意 0 不能做首位)。例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的最小的数就是 10015558。
现给定数字,请编写程序输出能够组成的最小的数。
输入格式:
输入在一行中给出 10 个非负整数,顺序表示我们拥有数字 0、数字 1、……数字 9 的个数。整数间用一个空格分隔。10 个数字的总个数不超过 50,且至少拥有 1 个非 0 的数字。
输出格式:
在一行中输出能够组成的最小的数。
输入样例:
2 2 0 0 0 3 0 0 1 0
输出样例:
10015558
思路1:
用一个数组保存10个非负整数的个数,根据各个非负整数出现的次数,把他们转化成字符,push进一个字符串的尾部
假设有字符串s,给出2个0,就将2个0转化成字符,添加到s的尾部, s.push_back(0+48) 执行2次
字符 c = '1', 将char转成int:int a = c - 48
整型 a = 1,将int转成char: char c = a + 48
最后遍历字符串,如果第一位是0,就将第一位非0字符与第一位进行交换
思路2:
用一个数组保存10个非负整数的个数
从1-9中选一个最小的数输出1次,其个数-1
然后从0开始依次输出数组
C++实现
思路1
1 #include <iostream> 2 #include <algorithm> 3 #include <string> 4 using namespace std; 5 6 int main() 7 { 8 const int N = 10; 9 int arr[N]; 10 string s; 11 for (int i = 0; i < N; ++i) 12 { 13 cin >> arr[i]; 14 for (int j = 0; j < arr[i]; ++j) 15 { 16 s.push_back((i + 48)); 17 } 18 19 } 20 sort(s.begin(), s.end()); 21 if (s.at(0) == '0') 22 { 23 for (int i = 1; i < s.size(); ++i) 24 { 25 if (s[i] != '0') 26 { 27 char temp = s[i]; 28 s[i] = s[0]; 29 s[0] = temp; 30 break; 31 } 32 } 33 } 34 cout << s; 35 return 0; 36 }
思路2
1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 const int N = 10; 7 int arr[10]; 8 for (int i = 0; i < N; ++i) 9 { 10 cin >> arr[i]; 11 } 12 13 for (int i = 1; i < N; ++i) 14 { 15 if (arr[i] != 0) 16 { 17 cout << i; 18 arr[i]--; 19 break; 20 } 21 } 22 23 for (int i = 0; i < N; ++i) 24 { 25 for (int j = 0; j < arr[i]; ++j) 26 { 27 cout << i; 28 } 29 } 30 return 0; 31 }
Java实现
思路2
1 import java.util.Scanner; 2 3 public class Main { 4 public static void main(String[] args) { 5 Scanner input = new Scanner(System.in); 6 int[] num = new int[10]; 7 for (int i = 0; i < 10; i++) { 8 num[i] = input.nextInt(); 9 } 10 for (int i = 1; i < 10; i++) { 11 if (num[i] != 0) { 12 System.out.print(i); 13 num[i]--; 14 break; 15 } 16 } 17 for (int i = 0; i < num[0]; i++) { 18 System.out.print(0); 19 } 20 for (int i = 1; i < 10; i++) { 21 for (int j = 0; j < num[i]; j++) { 22 System.out.print(i); 23 } 24 } 25 } 26 }