面试题45:把数组排成最小的数
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
这个题的难点与创新点在于构造出了我们需要的比较大小的方法,具体看代码中。要注意的几点:
cmp函数要定义成static成员函数,不然会报错。 比较大小的方法和string类型拼接的方法 程序开始之前判断输入是否为空,若为空返回空的string
代码:
class Solution { public: /* 定义大小规则:若两个数m和n,组合出来的mn和nm。若mn小于nm,则应输出mn,此时定义m<n;若mn大于nm,则应输出nm,此时定义n<m;若mn=nm,输出其中之一,此时定义n=m。 具体步骤: 1.先将int型数字都换成string类型存储在数组中; 2.定义string类型的比较函数,比较类型拼接直接用'+'即可; 3.sort函数给string数组由小到大排序,并将结果拼接输出。 */ static bool cmp(string &m, string &n) { return m + n < n + m; } string PrintMinNumber(vector<int> numbers) { string result; if(numbers.size()<=0) return result; vector<string> strNumbers; for (int i = 0; i < numbers.size(); ++i) { strNumbers.push_back(to_string(numbers[i])); } sort(strNumbers.begin(), strNumbers.end(),cmp); for (int i = 0; i < strNumbers.size(); ++i) { result += strNumbers[i]; } return result; } };