c语言 Largest Number leetcode

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”
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值