【27】面试题33:把数组排成最小的数

【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);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值