每日一题(59) - 把数组排成最小的数

本博客展示了如何通过自定义比较函数对整数数组进行排序,并将排序后的整数转换为字符串数组,最终输出排序后的字符串数组,实现数字的字典序排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码

#include <iostream>
#include <algorithm>
#include <string>
#include <assert.h>
using namespace std;

char** GetStrArr(int nArr[],int nLen)
{
	assert(nArr && nLen > 0);
	char** strArr = new char*[nLen];
	for (int i = 0;i < nLen;i++)
	{
		char* str = new char[10];//假设最大数字长度为9
		strArr[i] = itoa(nArr[i],str,10);
	}
	return strArr;
}

void Print(char** strArr,int nLen)
{
	assert(strArr && nLen > 0);
	for (int i = 0;i < nLen;i++)
	{
		cout<<strArr[i]<<" ";
	}
	cout<<endl;
}

bool Cmp(char* strFirst,char* strSec)
{
	assert(strFirst && strSec);
	string strF(strFirst);
	string strS(strSec);
	string strFS = strF + strS;
	string StrSF = strS + strF;
	return strFS < StrSF;	
}

void MinNum(int nArr[],int nLen)
{
	char** strArr = GetStrArr(nArr,nLen);
	sort(strArr,strArr + nLen,Cmp);
	Print(strArr,nLen);	
}

int main()
{
	//int nArr[3] = {3,32,321}; //321 32 3
	//int nArr[3] = {4,32,321};   //321 32 4
	//int nArr[4] = {4589,101,41425,9999};//101 41425 4589 9999
	//int nArr[11] = {1234,123,120,11,1540,234,32,321,322,323,324}; 
	                  //输出:11 120 123 1234 1540 234 321 322 32 323 324
	//int nArr[2] = {1234,123}; //123 1234
	//int nArr[2] = {323234,32}; //32 323234
	//int nArr[2] = {323231,32}; //323231 32
	//int nArr[2] = {323232,32}; //323232 32
	int nArr[2] = {323232,323232}; //323232 323232

	MinNum(nArr,2);
	system("pause");
	return 1;
}


代码

#include <iostream>
#include <algorithm>
#include <assert.h>
using namespace std;

char** GetStrArr(int nArr[],int nLen)
{
	assert(nArr && nLen > 0);
	char** strArr = new char*[nLen];
	for (int i = 0;i < nLen;i++)
	{
		char* str = new char[10];//假设最大数字长度为9
		strArr[i] = itoa(nArr[i],str,10);
	}
	return strArr;
}

void Print(char** strArr,int nLen)
{
	assert(strArr && nLen > 0);
	for (int i = 0;i < nLen;i++)
	{
		cout<<strArr[i]<<" ";
	}
	cout<<endl;
}

bool Cmp(char* strFirst,char* strSec)
{
	assert(strFirst && strSec);

	char* pCurF = strFirst;
	char* pCurS = strSec;
	char* pCur = NULL;
	while(*pCurF && *pCurF == *pCurS)
	{
		pCurF++;
		pCurS++;
	}
	//循环终止时,可能的情况:两字符都是0 + 两字符不等且全不为0 + 两字符不等且有一个为0
	if (*pCurF == *pCurS) //两字符都是0 
	{
		return false;
	}
	else
	{
		if (*pCurF == 0) //一个为0,一个不为0,
		{
			return Cmp(strFirst,pCurS);
		}
		else if (*pCurS == 0)
		{
			return Cmp(pCurF,strSec);
		}
		else 
		{
			if (*pCurF > *pCurS)
			{
				return false; //第一个字符串大
			}
			else
			{
				return true;
			}			
		}
	}
}

void MinNum(int nArr[],int nLen)
{
	char** strArr = GetStrArr(nArr,nLen);
	sort(strArr,strArr + nLen,Cmp);
	Print(strArr,nLen);	
}

int main()
{
	//int nArr[3] = {3,32,321}; //321 32 3
	//int nArr[3] = {4,32,321};   //321 32 4
	//int nArr[4] = {4589,101,41425,9999};//101 41425 4589 9999
	//int nArr[11] = {1234,123,120,11,1540,234,32,321,322,323,324}; 
	                  //输出:11 120 123 1234 1540 234 321 322 32 323 324
	//int nArr[2] = {1234,123}; //123 1234
	//int nArr[2] = {323234,32}; //32 323234
	//int nArr[2] = {323231,32}; //323231 32
	//int nArr[2] = {323232,32}; //323232 32
	int nArr[2] = {323232,323232}; //323232 323232

	MinNum(nArr,2);
	system("pause");
	return 1;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值