问题:
输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。
分析:
采用比较的方式,通过分析发现,如果m和n两个数字连成新的字符串,如果该mn>nm,那么n应该放在m之前,这样产生的新字符串组成的数字最小,这样我们可以采用排序的方式,只是排序中,采用的比较函数compare不是原来的基于整数比较,而是基于字符串对之间的比较。
代码来自于《剑指offer》:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <string>
using namespace std;
// Maxinum int number has 10 digits in decimal system
const int g_MaxNumberLength = 10;
// String buffers to combine two numbers
char* g_StrCombine1 = new char[g_MaxNumberLength * 2 + 1];
char* g_StrCombine2 = new char[g_MaxNumberLength * 2 + 1];
// Compare two numbers in strNumber1 and strNumber2
// if [strNumber1][strNumber2] > [strNumber2][strNumber1],
// return value > 0
// if [strNumber1][strNumber2] = [strNumber2][strNumber1],
// return value = 0
// if [strNumber1][strNumber2] < [strNumber2][strNumber1],
// return value < 0
int compare(const void* strNumber1, const void* strNumber2)
{
// [strNumber1][strNumber2]
strcpy(g_StrCombine1, *(const char**)strNumber1);
strcat(g_StrCombine1, *(const char**)strNumber2);
// [strNumber2][strNumber1]
strcpy(g_StrCombine2, *(const char**)strNumber2);
strcat(g_StrCombine2, *(const char**)strNumber1);
return strcmp(g_StrCombine1, g_StrCombine2);
}
// Given an array, print the minimum number
// by combining all numbers in the array
void PrintMinNumber(int* numbers, int length)
{
if(numbers == NULL || length <= 0)
return;
// Convert all numbers as strings
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]);
}
// Sort all strings according to algorithm in function compare
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[] ={ 32,321 };
PrintMinNumber(num, sizeof(num)/sizeof(num[0]));
return 0;
}
代码最困难的莫过于compare函数中的指针转换问题,这里比较绕,多想想指针是如何传递的。
总结:
需要理解排序方法的变体应用题目,这里是非常好的体现,排序的判断标准不同,排序出来的结果也完全不同。