您的位置:首页 > 职场人生

剑指Offer_面试题33_把数组排成最小的数

2017-08-17 21:05 169 查看


题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
分析:本质上其实是一种排序思想。数组中的两个元素m,n, 如果mn > nm 那么就认定m > n, 只要按照这个规则进行升序排序,然后将排序后的数组元素按顺序组合即可。相当于一个元素“小”,那么他尽量排在高位,这样保证组合起来的值尽可能小,于是可以排序,然后组合。
代码:

class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
string result = "";
if (!numbers.empty())
{
vector<string> strNum;
for (auto num : numbers)
{
strNum.push_back(to_string(num));
}
sort(strNum.begin(), strNum.end(), compare);
for (string s : strNum)
result.append(s);
}
return result;
}

static bool compare(string a, string b)
{
string numA = a + b;
string numB = b + a;
return numA < numB;    //"升序"
}
};


总结:如果用全排列比较选取最小的,这种办法效率太低。看透本质是关键。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息