题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路就是定义一种比较运算,如3>32,就是位数如果不够就用最后一位去填充,一直比较完每一位为止。然后就是将vector里所有的元素按照这个大小顺序重新排列一次,依次输入stringstream,最后将每一个数字输出。
class Solution {
public:
string PrintMinNumber(vector<int> numbers)
{
int flag = 1;
stringstream ss;
string sort;
int i = 0, j = 0;
int size = numbers.size();
// 52, 32, 34, 25, 2
// 3,32,321
for (i = 0; i < size; i++)
for (j = size - 1; j > i; j--)
{
flag = Cmp(numbers[j], numbers[j - 1]);
if (flag)
swap(numbers[j], numbers[j - 1]);
}
for (int i = 0; i < size; i++)
ss << numbers[i];
ss >> sort;
return sort;
}
void decode(int n, int de[])
{
int bi = 0;
int not0 = 0;
int base = 10;
int i = 0;
int n0 = n;
while (n)
{
bi++;
n = n / 10;
}
base = 10;
while (n0)
{
de[bi-1] = n0 % 10;
n0 = n0 / 10;
bi--;
}
i = 9;
while (i >= 0)
{
if (de[i] > 0)
{
not0 = de[i];
break;
}
i--;
}
i = 0;
while (i <= 9)
{
if (de[i] == 0)
de[i] = not0;
i++;
}
}
int Cmp(int n1, int n2)
{
int tmp1[10] = { 0 }; int tmp2[10] = { 0 };
decode(n1, tmp1);
decode(n2, tmp2);
int i;
for (i = 0; i < 10; i++)
if (tmp1[i] < tmp2[i])
return 1;
else if (tmp1[i] > tmp2[i])
return 0;
return 0;
}
};