剑指offer.把数组排成最小的数

题目:

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

思路:

最简单的就是直接把所有的拼接方法全排列出来,然后比较,得出最小的那一个。

这个题实际上是希望我们找到一个排序规则,数组根据这个排序规则来得到最小的这个数字。这其中两个数拼接成一个数,实际上也是一个典型的大数问题,面对大数问题我们最一想到就是转化成字符串来存储数。现在最关键的就是设定一个规则来确定最小数。(若拼接字符串 x + y > y + x,则 xx “大于” yy ;反之,若 x + y < y + x,则 xx “小于” yy ;x “小于” y 代表:排序完成后,数组中 x 应在 y 左边;“大于” 则反之。)

代码实现:
 

int compare(const void* a, const void* b) {
    char tmp1[100] = "", tmp2[100] = "";
    char *s1 = *(char**)a, *s2 = *(char**)b;
    strcat(tmp1, s1);
    strcat(tmp1, s2);
    strcat(tmp2, s2);
    strcat(tmp2, s1);
    //return atoi(tmp1) - atoi(tmp2); 
    return atof(tmp1) - atof(tmp2);
}

char* minNumber(int* nums, int numsSize){
    char** str = (char**)malloc(sizeof(char*) * numsSize);
    for (int i = 0; i < numsSize; i++) {
        str[i] = (char*)malloc(sizeof(char) * 20);
        sprintf(str[i], "%d", nums[i]);
    }
    qsort(str, numsSize, sizeof(char*), compare);//快排
    char* res = (char*)calloc(5000, sizeof(char));
    for (int i = 0; i < numsSize; i++) {
        strcat(res, str[i]);
    }
    return res;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值