题目例如以下:

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. InheritableThreadLocal

    InheritableThreadLocal继承自ThreadLocal,但比ThreadLocal多一个特性: 子线程可以继承父亲线程上下文中的信息 但是,有两个点需要注意的: 只有子线程创建之前的 ...

  2. 如何创建C++程序

    下载Microsoft Visual C++ 6.0请点击这里:VC 6.0下载(包括中文版英文版)(支持Win7和XP) 首先,我们要进入Microsoft Visual C++集成开发环境(Int ...

  3. Python中的循环与跳出

    --start-- for循环: for i in range(3): user_input = input("Your username:") passwd = int(inpu ...

  4. python变量传递给系统命令的方法

    python程序内执行shell命令可以有几种方式,在http://www.cnblogs.com/xuxm2007/archive/2011/01/17/1937220.html 里都有详细介绍. ...

  5. Docker学习笔记(4) — 开启Docker远程访问

    默认情况下,Docker守护进程会生成一个socket(/var/run/docker.sock)文件来进程本地进程通信,而不会监听任何端口,因此只能在本地使用docker客户端或者使用Docker ...

  6. ※编程随笔※=>☆编程基础☆=>※№ SVN工具自动属性 $Author$ $Date$ $Revision$ $URL$ $Header$替换

    TortoiseSVN设置->常规设置->subversion 配置文件 ->编辑 或者 Windows XP 在 C:\Documents and Settings\Adminis ...

  7. 【linux驱动笔记】linux模块机制浅析

      1.   模块module 操作系统分微内核和宏内核,微内核优点,可以使操作系统仅作很少的事,其它事情如网络处理等都作为应用程序来实现,微内核精简的同时,必然带来性能的下降.而linux的宏内核设 ...

  8. 幻世(OurDream)2D图形引擎使用教程8——处理操作输入(2)

    声明:本教程版权归Lizcst Software Lab所有,欢迎转载,但是转载必须保留本段声明文字,并注明文章来源:http://blog.csdn.net/kflizcst 谢谢合作! 今天的教程 ...

  9. JS实现图片翻书效果

    picture.html <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http- ...

  10. json 模块

    JSON: JSON-JSON (JavaScript 对象标记) 编码/解码 简介: use JSON; # imports encode_json, decode_json, to_json an ...