PAT 乙级 1023.组个最小数 C++/Java
2024-09-05 11:48:22
给定数字 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(+) 执行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
#include <iostream>
#include <algorithm>
#include <string>
using namespace std; int main()
{
const int N = ;
int arr[N];
string s;
for (int i = ; i < N; ++i)
{
cin >> arr[i];
for (int j = ; j < arr[i]; ++j)
{
s.push_back((i + ));
} }
sort(s.begin(), s.end());
if (s.at() == '')
{
for (int i = ; i < s.size(); ++i)
{
if (s[i] != '')
{
char temp = s[i];
s[i] = s[];
s[] = temp;
break;
}
}
}
cout << s;
return ;
}
思路2
#include <iostream>
using namespace std; int main()
{
const int N = ;
int arr[];
for (int i = ; i < N; ++i)
{
cin >> arr[i];
} for (int i = ; i < N; ++i)
{
if (arr[i] != )
{
cout << i;
arr[i]--;
break;
}
} for (int i = ; i < N; ++i)
{
for (int j = ; j < arr[i]; ++j)
{
cout << i;
}
}
return ;
}
最新文章
- easy ui 1.4的NumberBox,失去焦点后不能再次输入小数点
- Net-Speeder为OpenVZ加速
- IIS SMTP Queue stuck
- HDU 3308 LCIS (线段树区间合并)
- 【JS】Intermediate3:AJAX
- PowerShell优化和性能测试
- PHP 的try catch 报错捕获机制
- dos判断系统版本
- [Unity3D]Unity3D游戏开发之刀光剑影特效的实现
- MacOSX 中如何动态隐藏Dock Icon
- 【Android Developers Training】 46. 处理音频外放设备
- linux系统莫名被黑的诡异经历
- 非常棒的教程记录(JVM)
- VUE的一个数据绑定与页面刷新相关的bug
- jvm虚拟机--垃圾回收子系统
- Android编译环境——ubuntu12.04上android2.3.4编译错误以及解决
- eclipse 和 javaClass
- 170529、springMVC 的工作原理和机制
- 475. Heaters
- STM32F103C8T6、STM32F103ZET6工程模板