【1】题目
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3, 32, 321},则打印出这3个数字能排成的最小数字321323。
【2】思路
(1)这个题目最直接的做法应该是先求出这个数组中所有数字的全排列,然后把每个排列拼起来,最后求出拼起来的数字的最大值。求数组的排列和面试题 28“字符串的排列”非常类似,这里不再详细介绍。根据排列组合的知识,n个数字总共有n!个排列。
(2)根据题目的要求,两个数字 m 和 n 能拼接成数字 mn 和 nm。如果mn<nm,那么我们应该打印出mn,也就是m应该排在n的前面,我们定义此时m小于n;反之,如果nm<mn,我们定义n小于m。如果mn=nm, m等于n。在下文中,符号“<”、“>”及“=”表示常规意义的数值的大小关系,而文字“大于”、“小于”、“等于”表示我们新定义的大小关系。接下来考虑怎么去拼接数字,即给出数字 m 和 n,怎么得到数字 mn和nm并比较它们的大小。直接用数值去计算不难办到,但需要考虑到一个潜在的问题就是m和n 都在int能表达的范围内,但把它们拼起来的数字mn和nm用int表示就有可能溢出了,所以这还是一个隐形的大数问题。
【3】代码
// Test32.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
#include<string>
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];
//字符串比较函数,返回值为0或者1
int compare(const void *strNumber1, const void *strNumber2)
{
//字符串复制
strcpy(g_strCombine1, *(const char* *)strNumber1);
//字符串连接
strcat(g_strCombine1, *(const char* *)strNumber1);
//字符串复制
strcpy(g_strCombine2, *(const char* *)strNumber2);
//字符串连接
strcat(g_strCombine2, *(const char* *)strNumber1);
return strcmp(g_strCombine1, g_strCombine2);
}
//@int *numbers:输入数组的首地址
//@int length:输入元素的个数
void PrintMinNumber(int *numbers, int length)
{
if (numbers==nullptr||length<=0)
{
return;
}
char **strNumbers = (char**)(new int[length]);
for (int i = 0; i < length; i++)
{
strNumbers[i] = new char[g_MaxNumberLength + 1];
// sprintf把格式化的数据写入某个字符串缓冲区,%d表示整形。
sprintf(strNumbers[i], "%d", numbers[i]);
}
//使用qsort()排序并用 bsearch()搜索是一个比较常用的组合,使用方便快捷。
//qsort 的函数原型是
//void qsort(void*base, size_t num, size_t width, int(__cdecl*compare)(const void*, const void*));
//各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针
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 numbers[10] = { 12,23,54,76,1,45,6 };
int length = 7;
PrintMinNumber(numbers, length);
}