剑指offer-把数组排成最小的数
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
解题思路
由于两个数的拼接可能超过int范围,所以考虑用字符串来比较。每次决定两个数的位置时,首先把两个数n、m分别拼接为字符串nm和mn,然后按照字典序排序小的在前面大的在后面,这样调用stl中的sort函数并按照此排序规则排序,就可得到拼接最小数字的顺序,再依次输出即可。
代码
1 class Solution { 2 public: 3 string PrintMinNumber(vector<int> numbers) { 4 sort(numbers.begin(),numbers.end(),cmp); 5 string s=""; 6 for(int i=0;i<numbers.size();i++){ 7 stringstream stream; 8 stream<<numbers[i]; 9 s+=stream.str(); 10 } 11 return s; 12 } 13 static bool cmp(int a, int b){ 14 stringstream stream1; 15 stream1<<a<<b; 16 string s1=stream1.str(); 17 stringstream stream2; 18 stream2<<b<<a; 19 string s2=stream2.str(); 20 return s1<s2; 21 } 22 };