【劍指offer】把陣列排成最小的數

蘭亭風雨發表於2014-06-03

轉載請註明出處:http://blog.csdn.net/ns_code/article/details/28128551

題目描述:

輸入一個正整數陣列,把陣列裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則列印出這三個數字能排成的最小數字為321323。

輸入:

輸入可能包含多個測試樣例。
對於每個測試案例,輸入的第一行為一個整數m (1<=m <=100)代表輸入的正整數的個數。
輸入的第二行包括m個正整數,其中每個正整數不超過10000000。

輸出:

對應每個測試案例,
輸出m個數字能排成的最小數字。

樣例輸入:
3
23 13 6
2
23456 56
樣例輸出:
13236
2345656
    這道題主要要自定義一個比較組合後的數字的大小的規則,主要是對於數字m和n,先將其轉化為字串,而後比較其組合mn和nm的大小,這裡直接按照字串的大小標準來比較即可,最後用qsort進行排序,排序後的字串陣列中的字串從左向右組合起來的字串即使最小的字串,即轉化為整數後為最小的整數。

    AC程式碼如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char strs[100][10];

/*
自定義比較規則
*/
int mycompare(const void *str1,const void *str2)
{
	static char s1[20];
	static char s2[20];
	char *string1 = (char *)str1;
	char *string2 = (char *)str2;
	//將兩個字串合併在一起
	sprintf(s1,"%s%s",string1,string2);
	sprintf(s2,"%s%s",string2,string1);

	return strcmp(s1,s2);
}

/*
以字串形式列印出最小的整數
*/
void PrintMinNum(int *nums,int len)
{
	if(nums==NULL || len<1)
		return;

	int i;
	//將整數寫入到字串中
	for(i=0;i<len;i++)
		sprintf(strs[i],"%d",nums[i]);

	//按照mycompare中指定的規則排序
	qsort(strs,len,10*sizeof(char),mycompare);
	
	for(i=0;i<len;i++)
		printf("%s",strs[i]);
	printf("\n");
}


int main()
{
	int nums[100];
	int m;
	while(scanf("%d",&m) != EOF)
	{
		int i;
		for(i=0;i<m;i++)	
			scanf("%d",nums+i);

		PrintMinNum(nums,m);
	}

	return 0;
}
    
/**************************************************************
    Problem: 1504
    User: mmc_maodun
    Language: C++
    Result: Accepted
    Time:240 ms
    Memory:1020 kb
****************************************************************/

相關文章