您的位置:首页 > 职场人生

面试题37:把数组排成最小的数

2015-12-30 22:38 399 查看
题目:

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

边界条件及异常:

数组为空

思路:

这题可以需要建立对任意两个数自己的比较规则。然后根据这个规则进行排序即可。

如果是单位数,显然小的在前。

如果是32和321,结合后有32321和32132两种结果,比较这两种结果即可。

在程序中先将整数转为字符串,在进行比较与合并更方便。

比较规则确定后,用快速排序即可。

时间复杂度:O(nlgn)

#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <stack>
#include <algorithm>
#include <hash_set>  //for hashtable
#include <hash_map>
#include <set>
#include <ctime>
using namespace std;

const int maxNumberLength = 10;
char *strCombine1 = new char[maxNumberLength * 2 + 1];
char *strCombine2 = new char[maxNumberLength * 2 + 1];

int myCompare(const void *x, const void *y)   //qsort要求此处为void
{
strcpy_s(strCombine1, maxNumberLength * 2 + 1, *(const char**)x);//不能用(char *)&x
strcat_s(strCombine1, maxNumberLength * 2 + 1, *(const char**)y);
strcpy_s(strCombine2, maxNumberLength, *(const char**)y);
strcat_s(strCombine2, maxNumberLength, *(const char**)x);
return strcmp(strCombine1, strCombine2);
}

void PrintMinNumber(vector<int> nums)
{
int size = nums.size();
if (size <= 0) return;
char **strNumbers = (char**)(new int[size]);
for (int i = 0; i < size; ++i)
{
strNumbers[i] = new char[maxNumberLength + 1];
sprintf_s(strNumbers[i], maxNumberLength, "%d", nums[i]);
}
//sort(strNumbers.begin(), strNumbers.end(), myCompare);
qsort(strNumbers, size, sizeof(char*), myCompare);  //注意比较sort和qsort的区别
for (int i = 0; i < size; ++i)
cout << strNumbers[i];
cout << endl;
for (int i = 0; i < size; ++i)
delete [] strNumbers[i];
delete[] strNumbers;
}

int main()
{
int arr[] = { 3, 32, 321 };
vector<int> nums(arr, arr + 3);
PrintMinNumber(nums);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: