您的位置:首页 > 其它

微软100题(68)把数组排成最小的数

2015-06-10 09:48 232 查看
题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。

例如输入数组{32, 321},则输出这两个能排成的最小数字32132。

请给出解决问题的算法,并证明该算法。

思路:参见《剑指offer》,需要定义一种判断两个串大小的比较方式

"123""32" 和 "32""123" 前者小于后者,对应"123" < "32"

char* g_strCombine1 = new char[256];
char* g_strCombine2 = new char[256];
int CompareString(const void* strnumber1,const void* strnumber2)
{
<span style="white-space:pre">	</span>strcpy(g_strCombine1,*(const char**)strnumber1);
<span style="white-space:pre">	</span>strcat(g_strCombine1,*(const char**)strnumber2);

<span style="white-space:pre">	</span>strcpy(g_strCombine2,*(const char**)strnumber2);
<span style="white-space:pre">	</span>strcat(g_strCombine2,*(const char**)strnumber1);

<span style="white-space:pre">	</span>return strcmp(g_strCombine1,g_strCombine2);
}


按照这种大小关系从小到到排列,连接起来的串构成的数字最小

void PrintMinNumber(int* number,int len)
{
	if(number==NULL || len<=0) 
		return ;
	char** strnumber = (char**)(new int[len]);
	for (int i =0;i<len;++i)
	{
		strnumber[i] = new char[256];
		sprintf(strnumber[i],"%d",number[i]);
	}
	qsort(strnumber,len,sizeof(char*),CompareString);
	for (int i =0;i<len;++i)
		cout<<strnumber[i];
	cout<<endl;
	for (int i =0;i<len;++i)
		delete[] strnumber[i];
	delete[] strnumber;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: