美文网首页
[好题!]剑指offer 45

[好题!]剑指offer 45

作者: 再凌 | 来源:发表于2020-05-05 14:25 被阅读0次

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

回归C语言.
这道题的思路也是一个排序: 但是排序的依据是字符串衔接: s1 + s2 < s2 + s1, 那么判定s1比s2小

同时, 也学到了不少C语言的技巧: 虽然leetcode没有itoa, 但是可以使用sprintf()函数, 将内容打印到char*中. 当然也可以自己实现itoa:思路是先通过一个循环, 找到最高位的权重, 然后权重不断/=10, 最高位是%=weight

C语言自带的qsort可以排序, 但是传入compare函数的两个变量都是指针!!

char* itoa(int x)
{

    char *s = malloc(sizeof(char) * 10);
    sprintf(s,"%d",x);
    return s;
   
}

int compare(char **x, char **y)
{
    char temp1[20], temp2[20];
    sprintf(temp1, "%s%s", *x,*y);
    sprintf(temp2, "%s%s", *y,*x);
    return atol(temp1) - atol(temp2);
}

char* minNumber(int* nums, int numsSize){
    if(numsSize == 1) return itoa(nums[0]);
    char *result = malloc(sizeof(char) * numsSize * 10);
    result[0] = 0;
    char **cnums = malloc(sizeof(char*) * numsSize);
    for(int i =0; i< numsSize;i++)
    {
        cnums[i] = itoa(nums[i]);
    }    
    qsort(cnums, numsSize, sizeof(char*),  compare);
    for(int i = 0; i<numsSize;i++)
        strcat(result, cnums[i]);
    return result;

} 

相关文章

网友评论

      本文标题:[好题!]剑指offer 45

      本文链接:https://www.haomeiwen.com/subject/ywayghtx.html