索引请参考:系列目录
题目:
- 输入一个整数数组,把数组例多有数字拼接起来排成一个数,打印出来能拼接出来的所有数字中最小的一个。
- 示例:
- 输入:{3,32,321}
- 输出:321323
分析:
思路1:
- 该题目主要是对排列组合的考察。如果熟悉对STL熟悉的小伙伴,应该是一道很简单的题目
思路2:
- 对输入数组转化成string类型,然后对其进行升序排序。得到的便是最小是最小的拼接数
方法1:
std::string ret(number.size(), '9');
std::sort(number.begin(), number.end());
do
{
std::string temp;
for (auto elem : number)
temp += std::to_string(elem);
ret = std::min(temp, ret);
std::cout << temp << std::endl;
} while (std::next_permutation(number.begin(),number.end()));
return ret;
牛客运行结果:
方法2:
std::vector<std::string> str;
for (auto elem : number)
str.push_back(std::to_string(elem));
auto cmp = [](std::string a,std::string b) {
return a + b < b + a;
};
std::sort(str.begin(), str.end(), cmp);
std::string ret;
for (auto elem : str)
ret += elem;
return ret;
牛客运行结果:
评注:可以看出两种方法各有利弊。在注重时间效率的情况下,应该更加偏向方法1.在注重空间效率的情况下,应该更加偏向方法2。导致方法2时间效率不高的原因是:用标准模板库中的sort算法。该算法在正常情况下用的快排算法,最差情况下,用的是堆排算法。这样排序算法时间复杂度会从线性变为nlogn。