题目例如以下:

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) - 字符串排序的更多相关文章

  1. 1038. Recover the Smallest Number (30)

    题目链接:http://www.patest.cn/contests/pat-a-practise/1038 题目: 1038. Recover the Smallest Number (30) 时间 ...

  2. PAT 甲级 1038 Recover the Smallest Number (30 分)(思维题,贪心)

    1038 Recover the Smallest Number (30 分)   Given a collection of number segments, you are supposed to ...

  3. pat 甲级 1038. Recover the Smallest Number (30)

    1038. Recover the Smallest Number (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHE ...

  4. PAT 1038 Recover the Smallest Number (30分) string巧排序

    题目 Given a collection of number segments, you are supposed to recover the smallest number from them. ...

  5. PAT Advanced 1038 Recover the Smallest Number (30) [贪⼼算法]

    题目 Given a collection of number segments, you are supposed to recover the smallest number from them. ...

  6. 1038 Recover the Smallest Number (30)(30 分)

    Given a collection of number segments, you are supposed to recover the smallest number from them. Fo ...

  7. 1038 Recover the Smallest Number (30分)(贪心)

    Given a collection of number segments, you are supposed to recover the smallest number from them. Fo ...

  8. PAT甲题题解-1038. Recover the Smallest Number (30)-排序/贪心,自定义cmp函数的强大啊!!!

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789138.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  9. 【PAT甲级】1038 Recover the Smallest Number (30 分)

    题意: 输入一个正整数N(<=10000),接下来输入N个字符串,每个字符串包括至多8个字符,均为数字0~9.输出由这些字符串连接而成的最小数字(不输出前导零). trick: 数据点0只包含没 ...

随机推荐

  1. 利用httpclient和多线程刷訪问量代码

    缘起于玩唱吧,由于唱吧好友少,訪问量低,又不想加什么亲友团之类的,主要是太麻烦了,于是我就琢磨唱吧的訪问机制,准备用java的httpclient库来进行刷訪问量,想到动态IP反复使用就想到了用多线程 ...

  2. cygrunsrv: Error starting a service: QueryServiceStatus: Win32 error 1062: 解决办法

    问题原因:很可能是/var/log的权限设置不正确.首先执行 mkpasswd 和 mkgroup 重新生成权限信息,再删除sshd服务,重新配置 解决办法: $ mkpasswd -l > / ...

  3. vim打开文件时显示行号

    vim打开文件是,默认不提示行号. 至于显示行号的用途,因人而异 linux下一个主机可能有N个账户.对于配置分为两种:仅配置当前账户,配置所有账户 vim配置文件路径(Centos  5.5 fin ...

  4. 排行榜妙用——CSS计数器

    碰到的坑 小伙伴你们是否有碰到以下的情况,排行榜前3名的样式不一样,你们是怎么处理的么?

  5. 墙内安装nautilus-dropbox 1.6.0-2

    软件包:nautilus-dropbox 版本号:1.6.0-2 # aptitude install nautilus-dropbox # less `which dropbox` 查找到下载链接: ...

  6. android之wifi开发

    WIFI就是一种无线联网技术,常见的是使用无线路由器.那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网.如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热点 ...

  7. EFM32在使用IAR开发环境配置ICf文件以及指定程序存储地址空间

    EFM32在IAR开发环境下指定代码,数据的存储空间 为了便于后续的项目升级,管理,需要对代码,数据的存储空间加以设定,也在网上找下相关的资料,笔者水平有限, 如下内容不一定完全正确,如有错误之后,还 ...

  8. MPMoviePlayerController导致statusBar消失,导致内存泄露leak

    1.MPMoviePlayerController使statusBar消失 同事写项目时,运行程序总导致statusBar状态条消失,然后就是界面会上移20个像素,导致最下面空白界面,找原因一直不知道 ...

  9. DEBUG模式下, 内存中的变量地址分析

    测试函数的模板实现 /// @file my_template.h /// @brief 测试数据类型用的模板实现 #ifndef MY_TEMPLATE_H_2016_0123_1226 #defi ...

  10. php使用 _before_index() 来实现访问页面前,判断登录

    C:\wamp\www\DEVOPS\Home\Lib\Action: <?php class IndexAction extends Action { function index(){ $t ...