Given a list of non negative integers, arrange them such that they form the largest number.
Example 1:
Input:[10,2]
Output: "210"
Example 2:
Input:[3,30,34,5,9]
Output: "9534330"
Note: The result may be very large, so you need to return a string instead of an integer.
题意:给出一系列不定长度的整数,求得他们所构成的最大的数。由于最大的数可能超过int范围,所以需要用子符串表示。既然是表示将这些整数排列组合构成最大的数。那么就需要对这些整数按照一定顺序进行排列。对这些整数参考网友可以发现,这种解法对于两个数字a和b来说,如果将其都转为字符串,如果ab > ba,则a排在前面,比如9和34,由于934>349,所以9排在前面,再比如说30和3,由于303<330,所以3排在30的前面。按照这种规则对原数组进行排序后,将每个数字转化为字符串再连接起来就是最终结果。
C语言AC代码
void swap(int *p,int *q) //将p所在的地址指向的值和q地址所指向的值交换
{int temp =*p;
*p = *q;
*q = temp;
}
//比较大小
int compare(int a,int b) //对 a,b按照上文的比较方式进行比较
{
int i;
int temp;
char as[20],bs[20]; //整型数最多在10位,为了比较他们前后的大小,设定他们最大为20位
sprintf(as,"%d",a); //整型转字符串,也可用atoi函数,atoi函数效率更高
sprintf(bs,"%d",b);
int lena =strlen (as); //两个字符串的长度
int lenb = strlen(bs);
for(i=lena;i<lena+lenb;i++)
{
as[i] = bs[i-lena]; //将bs子符串加到as的后面
}
as[i]='\0'; //补充结束符
// printf("%s\n",as);
for(i=lenb;i<lena+lenb;i++)
{
bs[i] = as[i-lenb]; //将as字符串加到bs的后头
}
bs[i]='\0';
// printf("%s\n",bs);
if(strcmp(as,bs)>0) //比较字符串函数,若字典序as>bs,那么返回大于0,若相等则返回0,若小于1则返回小于0
temp = 1;
else
temp = 0;
return temp; //返回值,相当于bool
}
void quicksort(int *array,int maxlen,int start,int end) //快速排序
{
int i,j,ch;
if(start<end)
{
i =start+1;
j =end;
while(i<j)
{
ch =compare(array[i],array[start]);
// printf("%d ",ch);
if(compare(array[i],array[start])==0)
{
swap(&array[i],&array[j]);
j--;
}
else
{
i++;
}
}
ch =compare(array[i],array[start]);
// printf("%d\n",ch);
if(compare(array[i],array[start])==0)
{
i--;
}
swap(&array[i],&array[start]);
quicksort(array,maxlen,start,i);
quicksort(array,maxlen,j,end);
// printf("%d %d\n",array[start],array[end]);
}
}
char* largestNumber(int* nums, int numsSize) {
int i;
quicksort(nums,numsSize,0,numsSize-1); //先对其快速排序
for(i=0;i<numsSize;i++)
printf("%d ",nums[i]);
printf("\n");
char *res = (char*)malloc(sizeof(char)*2); //动态分配字符数组
memset(res,'0',2); //赋值
char as[10]; //定义字符串
int count,nownum; //定义子浮窗长度和字符串res的长度
count =0;
for(int i=0;i<numsSize;i++)
{
sprintf(as,"%d",nums[i]); //整数转字符串
nownum = strlen(res); //res的长度
res = realloc(res,nownum+strlen(as));//对res再分配
for(int j=0;j<strlen(as);j++)
{
res[count+j]=as[j]; //将as加到res的尾部
}
printf("%d\n",strlen(res));
count =count+strlen(as);//得到现在res的长度
// printf("%d ",strlen(as));
memset(as,'0',10);//把as赋值为0
}
res[count] ='\0';//最后在res的count处置为结束符
printf("%s\n",res);
return res[0]=='0'?"0":res; //判断res是否为“0”
}