面试题45:把数组排成最小的数
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
解题思路
- 回溯法(较暴力)
- 重新定义比较数字函数(较高级)
上代码(C++香)
法一,回溯法递归出全排列
#include <iostream>
#include <vector>
#include <stack>
#include <string>
#include <cstring>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include "TreeNode.h"
using namespace std;
string minS = "99999999";
void mySwap(vector<int> &num, int i, int j){
int temp = num[j];
num[j] = num[i];
num[i] = temp;
}
bool isSwap(vector<int> num, int index, int n){
for(int i = index + 1; i < n; i++){
if(num[i] == num[index])
return false;
}
return true;
}
void dfs(vector<int> &num, int index, int n){
if(index == n){
string nowS;
for(int i = 0; i < n; i++)
nowS = nowS + to_string(num[i]);
if(nowS < minS)
minS = nowS;
return ;
}
for(int i = index; i < n; i++){
if(isSwap(num, i, n)){
mySwap(num, i, index);
dfs(num, index + 1, n);
mySwap(num, i, index);
}
}
}
// 使用全排列来判断
string PrintMinNumber(vector<int> numbers) {
dfs(numbers, 0, numbers.size());
return minS;
}
int main()
{
vector<int> num;
num.push_back(3);
num.push_back(32);
num.push_back(321);
cout<<PrintMinNumber(num)<<endl;
return 0;
}
法二:重新定义数字的比较函数
比如数字3与32,因为323<332,所以32<3。
#include <iostream>
#include <vector>
#include <stack>
#include <string>
#include <cstring>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include "TreeNode.h"
using namespace std;
const int g_MaxNumberLength = 10;
char* g_StrCombine1 = new char[g_MaxNumberLength * 2 + 1];
char* g_StrCombine2 = new char[g_MaxNumberLength * 2 + 1];
// 重新定义数字比较函数
int compare(const void* strNumber1, const void* strNumber2){
strcpy(g_StrCombine1, *(const char**)strNumber1);
strcat(g_StrCombine1, *(const char**)strNumber2);
strcpy(g_StrCombine2, *(const char**)strNumber2);
strcat(g_StrCombine2, *(const char**)strNumber1);
return strcmp(g_StrCombine1, g_StrCombine2);
}
void PrintMinNumber(int numbers[], int length){
if(length <= 0)
return ;
char** strNumbers = (char**)(new int[length]);
for(int i = 0; i < length; i++){
strNumbers[i] = new char[g_MaxNumberLength + 1];
sprintf(strNumbers[i], "%d", numbers[i]);
}
// 根据自定义的比较函数调用快排进行排序
qsort(strNumbers, length, sizeof(char*), compare);
for(int i = 0; i < length; i++)
printf("%s", strNumbers[i]);
printf("\n");
for(int i = 0; i < length; i++)
delete[] strNumbers[i];
delete[] strNumbers;
}
int main()
{
int num[] = {3,32,321};
PrintMinNumber(num, 3);
return 0;
}