题目(来源:牛客上剑指offer):
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路:
现将int数组转换成string数组,然后对string数组排序,排序规则是:str1+str2与str2+str1比较,如果str1+str2 < str2+str1,那么str1排在str2前面。因为两个string可能不一样长,将两个拼接一下,再进行比较。比如123和12,12312 > 12123
代码:
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
class Solution {
public:
string _tostring(int x){ // C++中有to_string(int)这个函数,但我编译器版本可能比较低,所以手动写了一个
string str = "";
int p = 1;
while(x / p > 10) p *= 10;
while(x){
str += x / p + '0';
x %= p;
p /= 10;
}
return str;
}
static bool cmp(const string &str1, const string &str2){
return (str1+str2) < (str2+str1);
}
string PrintMinNumber(vector<int> numbers) {
string ans = "";
if(numbers.size()==0)return ans;
vector<string> v;
for(int i = 0; i < numbers.size(); i++) v.push_back(_tostring(numbers[i]));
sort(v.begin(), v.end(), cmp);
for(int i = 0; i < v.size(); i++) ans += v[i];
return ans;
}
};
int main(){
vector<int> v;
v.push_back(3);
v.push_back(31);
v.push_back(321);
Solution s;
string ans = s.PrintMinNumber(v);
cout<<ans<<endl;
}