面试题33:把数组排成最小数
题目:输入一个正整数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323
预备知识:
qsort函数的使用,在头文件<stdlib.h>中,参考:http://www.cplusplus.com/reference/cstdlib/qsort/?kw=qsort
大数问题的解决方案:把数字转换为字符串。
C++中的最大整数:2147483647 ,刚好为10位,头文件<Limits.h> 有定义,即#define INT_MAX 2147483647
思路:
第一种思路,这道题最直观的做法,就是对所有数字进行全排序,然后选出最小的数。
第二种思路,就是将数组中的数字转换为字符串,然后通过组合字符串,通过对字符串进行排序,然后输出结果。
注意事项:由于题目中提到是输入的是正整数数组,在组合数字的时候,要考虑溢出的问题,显然这是一个大数问题。
算法实现:
// 面试题33.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <string.h> //strcpy ,strcmp, strcat
//#include <algorithm> //qsort
#include <stdlib.h>
// 把数组排成最小的数
//在C++下面的Limits.h 直接定义了最大的值,直接用INT_MAX就可以!
//#define INT_MAX 2147483647 /* maximum (signed) int value */
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);
void PrintMinNumber(int* numbers, int length)
{
if(numbers == NULL || 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 compare(const void* strNumber1, const void* strNumber2)
{
strcpy(g_StrCombine1, *(const char**)strNumber1); //复制
strcat(g_StrCombine1, *(const char**)strNumber2); //连接mn
strcpy(g_StrCombine2, *(const char**)strNumber2); //复制
strcat(g_StrCombine2, *(const char**)strNumber1); //连接nm
return strcmp(g_StrCombine1, g_StrCombine2); //比较
}
//****************测定代码*******************
void Test(char* testName, int* numbers, int length, char* expectedResult)
{
if(testName != NULL)
printf("%s begins:\n", testName);
if(expectedResult != NULL)
printf("Expected result is: \t%s\n", expectedResult);
printf("Actual result is: \t");
PrintMinNumber(numbers, length);
printf("\n");
}
void Test1()
{
int numbers[] = {3,3,323,4,2};
Test("Test1", numbers, sizeof(numbers)/sizeof(int), "23334");
}
int _tmain(int argc, _TCHAR* argv[])
{
Test1();
return 0;
}