题目例如以下:

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. Sort List 分类: leetcode 算法 2015-07-10 15:35 1人阅读 评论(0) 收藏

    对链表进行排序,要求时间复杂度为O(n log n) ,不使用额外的空间. 我一开始的想法是借助quicksort的思想,代码如下: # time O(nlog(n)) # Definition fo ...

  2. linux下利用sed重命名文件

    3 for file in `ls ./*.*`  4 do  5 mv $file `echo $file|sed 's/IM_21R_ID331/1M21R_ID331/g'`  6 done  ...

  3. 基于visual Studio2013解决算法导论之009快速排序随机版本

     题目 快速排序随机版本 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> ...

  4. IE6 png图片实现半透明的方法

    IE6中支持PNG半透明图片完美解决方法-divcss5亲測 从IE7及IE7以上版本号都支持PNG半透明格式图片,而只有IE6不支持png格式透明图片,而GIF半透明效果不及png半透明格式图片,由 ...

  5. UVa 二分图匹配 Biginners

    UVa 1045 - The Great Wall Game 最小权匹配 题意:给你一个n*n的棋盘,上面有n个棋子,要求通过移动各个棋子使得棋子在同一行或者同一列或者对角线上,求最小移动次数. 思路 ...

  6. ffmpeg h265

    最新版本号的ffmpeg 支持 libh265,可是还是0基础測试阶段 在linux 上安装ffmpeg 支持h265编码器依照下面步骤: Anyhow here are the simple ste ...

  7. Machine Learning #Lab1# Linear Regression

    Machine Learning Lab1 打算把Andrew Ng教授的#Machine Learning#相关的6个实验一一实现了贴出来- 预计时间长度战线会拉的比較长(毕竟JOS的7级浮屠还没搞 ...

  8. android中 System.exit(0)的理解

    public class HelloGoodbye{ try{ System.out.println(“Hello World”); System.exit(0); } finally { Syste ...

  9. android的JNI标准 android的NDK

    转载的! Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) ...

  10. jquery实现ajax提交form表单的方法总结

    本篇文章主要是对jquery实现ajax提交form表单的方法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 方法一:  function AddHandlingFeeToRefund( ...