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 }
View Code

思路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 }
View Code

 

 

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 }
View Code

 



posted @ 2019-10-06 13:25  47的菠萝~  阅读(225)  评论(0编辑  收藏  举报