题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的那个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323.
解题思路
要得到最小的数字,即需要最高位的数字要最小,但这不是简单的判断数组中元素数值的大小,而是需要数组元素从左到右的最高位数字要小,例如:{9,111}组成的最小数为 1119,而不是9111. 可以通过将数字转换为字符串然后比较字符串的大小,即满足从左到右每个最高位上数字小。
自定义一种排列顺序规则:
将a 和 b 转换为字符串,若 a + b < b + a ==> a < b; 若 a + b > b + a ==> a > b; 若 a + b = b + a ==> a=b.
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public: static bool cmp(int a, int b) { string A = to_string(a) + to_string(b); string B = to_string(b) + to_string(a); return A < B; } string PrintMinNumber(vector<int> numbers) { if (numbers.empty()) return ""; sort (numbers.begin(), numbers.end(), cmp); string result; for (int i = 0; i < numbers.size(); i++) { result += to_string(numbers[i]); } return result; } };
|
在C++中,cmp函数需要使用 static 进行声明,声明是静态成员函数,这样才能正确调用。
参考博文链接:https://cuijiahua.com/blog/2018/01/basis_32.html