1038. Recover the Smallest Number (30) - 字符串排序
题目例如以下:
Given a collection of number segments, you are supposed to recover the smallest number from them. For example, given {32, 321, 3214, 0229, 87}, we can recover many numbers such like 32-321-3214-0229-87 or 0229-32-87-321-3214 with respect to different orders
of combinations of these segments, and the smallest number is 0229-321-3214-32-87.
Input Specification:
Each input file contains one test case. Each case gives a positive integer N (<=10000) followed by N number segments. Each segment contains a non-negative integer of no more than 8 digits. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print the smallest number in one line. Do not output leading zeros.
Sample Input:
5 32 321 3214 0229 87
Sample Output:
22932132143287
最初看到这个题目。我先想到的是桶排序,设置0到9号桶。先依照最高位把数字分别装入桶内,然后针对不同的桶,依照从高位优先排序,当中数字小的相应的字符串小,假设位数不同而且前面长的字符串和短的字符串前面全然一致,则看长字符串后面的部分和桶序号哪个大,比桶序号大的说明这个数应该往后放,由于桶内的全部数字都是以桶序号开头。假设把这样一个数字放到前面,则会出现新拼接的字符串命名能够以桶序号开头却以一个比桶序号大的数开头,详细实现为先按上面的规则定义字符串比較函数。然后对每一个桶进行插入排序。须要注意的问题是第一个数的选取。应该选取桶0中除去前导0后数字最小的,把它抛开,再对其它数进行上面的排序,最后从桶0開始输出到最后一个桶。我后来实现了这个算法,可是有一些BUG没有解决,仅仅能得到20分。
后来通过网上查阅资料发现我把这个题想复杂了,事实上仅仅须要比較字符串然后排序就可以。对于两个字符串a和b,比較ab和ba的大小,为了让数字最小,要让最小的字符串在前面,也就是ab < ba是我们所期望的,因此仅仅须要把全部字符串依照这个规则排序就可以。
须要注意的是,输出时第一个数不能有前导0,假设全部数字都是0。我们仅仅能输出一个0。
为了这两个需求,我使用了stringstream把字符串转为数字。
对于第一个数字,仅仅须要直接转为数字输出就可以。
为了推断是否所有数字都是0,找到最大的字符串。也就是排序后的最后一个,看它转为数字是否是0,假设是,最大的都是0,说明所有都是0,这时候直接输出一个0然后返回。
#include <iostream>
#include <vector>
#include <string>
#include <string.h>
#include <algorithm>
#include <sstream> using namespace std; int compare(string a, string b){
string ab = a + b;
string ba = b + a;
return ab < ba;
} int main(){ int N;
vector<string> nums;
string buffer;
cin >> N;
for(int i = 0; i < N; i++){
cin >> buffer;
nums.push_back(buffer);
}
sort(nums.begin(),nums.end(),compare);
stringstream ss;
int num; // 排除全0情况。先找最大的字符串看是否为0
ss << nums[nums.size()-1];
ss >> num;
if(num == 0){
cout << 0 << endl;
return 0;
}
// 注意清除原来的输入
ss.clear(); ss << nums[0];
ss >> num;
cout << num;
for(int i = 1; i < nums.size(); i++){
cout << nums[i];
}
cout << endl;
}
1038. Recover the Smallest Number (30) - 字符串排序的更多相关文章
- 1038. Recover the Smallest Number (30)
题目链接:http://www.patest.cn/contests/pat-a-practise/1038 题目: 1038. Recover the Smallest Number (30) 时间 ...
- PAT 甲级 1038 Recover the Smallest Number (30 分)(思维题,贪心)
1038 Recover the Smallest Number (30 分) Given a collection of number segments, you are supposed to ...
- pat 甲级 1038. Recover the Smallest Number (30)
1038. Recover the Smallest Number (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHE ...
- PAT 1038 Recover the Smallest Number (30分) string巧排序
题目 Given a collection of number segments, you are supposed to recover the smallest number from them. ...
- PAT Advanced 1038 Recover the Smallest Number (30) [贪⼼算法]
题目 Given a collection of number segments, you are supposed to recover the smallest number from them. ...
- 1038 Recover the Smallest Number (30)(30 分)
Given a collection of number segments, you are supposed to recover the smallest number from them. Fo ...
- 1038 Recover the Smallest Number (30分)(贪心)
Given a collection of number segments, you are supposed to recover the smallest number from them. Fo ...
- PAT甲题题解-1038. Recover the Smallest Number (30)-排序/贪心,自定义cmp函数的强大啊!!!
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789138.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- 【PAT甲级】1038 Recover the Smallest Number (30 分)
题意: 输入一个正整数N(<=10000),接下来输入N个字符串,每个字符串包括至多8个字符,均为数字0~9.输出由这些字符串连接而成的最小数字(不输出前导零). trick: 数据点0只包含没 ...
随机推荐
- T-Sql中的pivot和unpivot
写在前面 今天休息,抽空了解下pivot和unpivot,记得老师讲行转列的时候,貌似提到过,不过他说的最多的就是“这个你们私下可以自己学,很简单的...”,简单你咋不讲呢,不吐槽他了,还是好好整理下 ...
- Sql Server 循环添加日期--(累加到一个字段中)
SQL语句: ),) '
- ArrayList集合-[长度问题]--C#
list.Count//获取集合中实际元素的个数.list.Capacity//获取集合中可包含的元素数. /** * 每次集合中实际包含元素的个数(Count)超过了可以包含的元素的个数(Cap ...
- 什么是C# Lambda表达式?形如:p=>p.abc
这里介绍C# Lambda表达式,它实际上和匿名方法没有什么不同.Lambda的输入参数就对应着delegate括号里面的参数,由于C# Lambda表达式可以推断参数的类型,所以这里的参数无需声明. ...
- 点击datalist中Button按钮出现“回发或回调参数无效......”
遇到问题: 回发或回调参数无效.在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page ...
- iOS UITextField垂直居中
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
- Qt 富文本处理(QTextDocument和QTextBlock和QTextFrame和QTextTable和QTextList和QTextDocument)
最近使用 Qt 做一个离线博客编辑器,因而用到了 Qt 的富文本处理.参考 Qt 的文档,记录下 Qt 的富文本处理的相关技术.文档地址是 http://doc.qt.nokia.com/4.7/ri ...
- Beginning MyBatis 3 Part 2 : How to Handle One-to-Many and One-to-One Selects
One of the latest MyBatis feature is the ability to use Annotations or XML to do One-to-One or One-t ...
- C++ strcpy strcpy_s strncpy strlcpy
strncpy的用法:它与strcpy的不同之处就在于复制n个字符,而不是把所有字符拷贝(包括结尾'\0'). 函数原型:char * strncpy(char *dst,const char * s ...
- android的JNI标准 android的NDK
转载的! Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) ...