zerofly's Blog

努力不一定成功,但不努力一定不会成功

0%

把数组排成最小的数


题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的那个。例如输入数组{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; // 意味着,当A<B时,把a放到b前,按小到大排序。当A>B时,返回0,交换位置。
}

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

文章作者:zerofly

发布时间:2020年05月28日 - 16:05

原始链接:http://zeroflycui.github.io/ce969fd0.html

许可协议: 转载请保留原文链接及作者。