现在的位置: 首页 > 综合 > 正文

题目1504:把数组排成最小的数

2017年12月25日 ⁄ 综合 ⁄ 共 4641字 ⁄ 字号 评论关闭

题目描述:

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

输入:

输入可能包含多个测试样例。对于每个测试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数。输入的第二行包括m个正整数,其中每个正整数不超过10000000。

输出:

对应每个测试案例,输出m个数字能排成的最小数字。

样例输入:
3
23 13 6
2
23456 56
样例输出:
13236
2345656

感觉很简单的题目,自己尝试了几个测试用例都对的,提交后 全部WRONG ANSWER

#include <cstdio>
#include <cstring>

typedef unsigned int u_int32_t;
typedef u_int32_t Compare(u_int32_t,u_int32_t);
#define MAX_BIT_COUNT 8



u_int32_t CompareTwoElementGetMax(u_int32_t first_arg,u_int32_t second_arg)
{
	u_int32_t first = first_arg;
	u_int32_t second = second_arg;
	u_int32_t first_bit_array[MAX_BIT_COUNT];
	u_int32_t second_bit_array[MAX_BIT_COUNT];
	u_int32_t first_bits_count = 0;
	u_int32_t second_bits_count = 0;
	short f = 0,s = 0;
	
	while(first)
	{
		first_bit_array[first_bits_count] = first%10;
		if(first_bit_array[0] != first_bit_array[first_bits_count])
		{
			f = 1;
		}
		first_bits_count++;
		first = first/10;
	}
	u_int32_t i = --first_bits_count;
	while(second)
	{
		second_bit_array[second_bits_count] = second%10;
		if(second_bit_array[0] != second_bit_array[second_bits_count])
		{
			s = 1;
		}		
		second_bits_count++;
		second = second/10;
	}
	u_int32_t j = --second_bits_count;
	if(f == 0 && s == 0)
	{
		return 0;
	}
	while(i<=MAX_BIT_COUNT || j<=MAX_BIT_COUNT)
	{
		while(first_bit_array[i] == second_bit_array[j] && i<=MAX_BIT_COUNT && j<=MAX_BIT_COUNT )
		{
			i--;
			j--;
		}
		if(i>MAX_BIT_COUNT&& j<=MAX_BIT_COUNT)
		{
			i = first_bits_count;
		}
		else if(j>MAX_BIT_COUNT && i<=MAX_BIT_COUNT)
		{
			j = second_bits_count;
		}
		else if(i>MAX_BIT_COUNT && j>MAX_BIT_COUNT)
		{
			return 0;
		}
		else 
		{
			if(first_bit_array[i] > second_bit_array[j])
			{
				return 1;
			}
			else
			{
				return 2;
			}
		}
	}
	printf("不可能到这里来\n");
	return 0;
}

u_int32_t CompareStringGetMin(char* first,char *second,u_int32_t string_size)
{
	for(u_int32_t i = 0;i < string_size;i++)
	{
		if(*(first+i) < *(second+i))
		{
			return 1;
		}
		else if(*(first+i) > *(second+i))
		{
			return 2;
		}
	}
	return 0;
}

u_int32_t CompareTwoElementGetMaxIndex(u_int32_t first_arg,u_int32_t second_arg)
{
	char first_second[2*MAX_BIT_COUNT];
	char second_first[2*MAX_BIT_COUNT];
	memset(first_second,0,sizeof(first_second));
	memset(second_first,0,sizeof(second_first));
	
	u_int32_t i = 2*MAX_BIT_COUNT-1;
	u_int32_t first = first_arg;
	u_int32_t second = second_arg;
	while(first_arg)
	{
		second_first[i] = first_arg%10 + '0';
		first_arg/=10;
		i--;
	}
	while(second_arg)
	{
		second_first[i] = second_arg%10 + '0';
		second_arg/=10;
		i--;
	}
	i = 2*MAX_BIT_COUNT-1;
	first_arg = first;
	second_arg = second;	
	while(second_arg)
	{
		first_second[i] = second_arg%10 + '0';
		second_arg/=10;
		i--;
	}
	while(first_arg)
	{
		first_second[i] = first_arg%10 + '0';
		first_arg/=10;
		i--;
	}
	i++;
	return CompareStringGetMin(first_second+i,second_first+i,2*MAX_BIT_COUNT);
}

void MergeArray(u_int32_t *first,u_int32_t array_size1,u_int32_t *second,u_int32_t array_size2,Compare my_compare)
{
	u_int32_t result;
	u_int32_t i = 0,j = 0,k = 0;
	u_int32_t target_array[array_size1+array_size2];
	while(i < array_size1&&j < array_size2)
	{
		result = my_compare(*(first+i),*(second+j));
		if(result == 0)
		{
			*(target_array+k) = *(first+i);
			k++;
			*(target_array+k) = *(second+j);
			k++;
			i++;
			j++;
		}
		else if(result == 1)
		{
			*(target_array+k) = *(first+i);
			k++;
			i++;			
		}
		else if(result == 2)
		{
			*(target_array+k) = *(second+j);
			k++;
			j++;		
		}
	}
	while(i < array_size1)
	{
			*(target_array+k) = *(first+i);
			k++;
			i++;			
	}
	while(j < array_size2)
	{
			*(target_array+k) = *(second+j);
			k++;
			j++;		
	}
	i = 0;
	while(i < array_size1)
	{
		*(first+i) = *(target_array+i);
		i++;
	}
	j = 0;
	while(j < array_size2)
	{
		*(second+j) = *(target_array+i);
		i++;
		j++;
	}	
	return;	
}

u_int32_t CompareTwoUnsignedInt(u_int32_t first_arg,u_int32_t second_arg)
{
	if(first_arg == second_arg)
	{
		return 0;
	}
	else if(first_arg < second_arg)
	{
		return 1;
	}
	return 2;
}

void MergeSort(u_int32_t *target_array,u_int32_t array_size)
{
	u_int32_t step = 2;
	u_int32_t begin;
	while(step<=array_size)
	{
		for(begin = 0;begin+step <= array_size;begin = begin+step)
		{
			MergeArray(target_array+begin,step/2,target_array+begin+step/2,step/2,CompareTwoElementGetMaxIndex);
		}
		if(begin!=array_size)
		{
			MergeArray(target_array+begin,(array_size - begin)/2,target_array+begin+(array_size - begin)/2,array_size-(array_size - begin)/2,CompareTwoElementGetMaxIndex);
		}
		step = step*2;
	}
	MergeArray(target_array,step/2,target_array+step/2,array_size-step/2,CompareTwoElementGetMaxIndex);
	//MergeArray(target_array,step/2,target_array+step/2,array_size-step/2,CompareTwoUnsignedInt);
	return;
}

void PrintArrayInFormatString(u_int32_t* target_array,u_int32_t array_size)
{
	u_int32_t tmp;
	char num[MAX_BIT_COUNT];
	memset(num,0,sizeof(num));
	char num_string[100*MAX_BIT_COUNT];
	memset(num_string,0,sizeof(num_string));
	for(u_int32_t i = 0,j = MAX_BIT_COUNT-1; i < array_size;i++,j = MAX_BIT_COUNT-1)
	{
		tmp = *(target_array+i);
		while(tmp)
		{
			num[j] = tmp%10+'0';
			tmp = tmp/10;
			j--;
		}
		strcat(num_string,num+j+1);
	}
	printf("%s\n",num_string);
}

int main()
{
	u_int32_t m;
	while(scanf("%u",&m)!=EOF)
	{
		u_int32_t target_array[m];
		for(u_int32_t i = 0; i<m; i++)
		{
			scanf("%u",&target_array[i]);
		}
		MergeSort(target_array,m);
		
		u_int32_t i = 0;
		while(i<m)
		{
			printf("%u",target_array[i]);
			i++;
		}
		printf("\n");
		PrintArrayInFormatString(target_array,m);
	}
	return 0;
}

抱歉!评论已关闭.