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

来源:互联网 发布:客户管理系统源码 编辑:程序博客网 时间:2024/06/01 10:05

题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{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;    //"升序"}};


总结:如果用全排列比较选取最小的,这种办法效率太低。看透本质是关键。