// 面试题45:把数组排成最小的数
// 题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼
// 接出的所有数字中最小的一个。例如输入数组{3, 32, 321},则打印出这3个数
// 字能排成的最小数字321323。
static void print_min_num(const std::vector<uint32_t>& arr)
{
if(arr.empty())
{
return;
}
std::vector<std::string> strs(arr.size());
for(size_t i = 0; i < arr.size(); ++i)
{
strs[i] = std::to_string(arr[i]);
}
std::array<char, 21> tmp1; // int型整数用十进制表示最多只有10位
std::array<char, 21> tmp2;
auto fun = std::bind(_compare, std::placeholders::_1, std::placeholders::_2,
std::ref(tmp1), std::ref(tmp2));
sort(strs.begin(), strs.end(), fun);
for(auto i:strs)
{
printf("%s", i.c_str());
}
printf("\n");
}
static int _compare(const std::string& str1, const std::string& str2,
std::array<char, 21>& tmp1, std::array<char, 21>& tmp2)
{
strcpy(static_cast<char*>(tmp1.begin()), str1.c_str());
strcat(static_cast<char*>(tmp1.begin()), str2.c_str());
strcpy(static_cast<char*>(tmp2.begin()), str2.c_str());
strcat(static_cast<char*>(tmp2.begin()), str1.c_str());
auto ret = strcmp(static_cast<char*>(tmp1.begin()), static_cast<char*>(tmp2.begin()));
return ret < 0;
}