179. 最大數

思路

這道題的關鍵是設計比較函數,利用qsort進行排序,排序之後進行輸出。
有幾個比較坑的特殊情況需要特別處理
1、輸入比較的參數爲0
2、返回的字符串爲“00000……”
比較函數的思路:可以直接按照題意,比較連接之後ab大還是ba大。

代碼

#include <string.h>
#include <stdlib.h> // for malloc(), free()
#include <math.h>
int compare(int *a, int *b)
{
    int A = *a;
    int B = *b;
    if (*a == 0) {
        return -1;
    } else if (*b == 0) {
        return 1;
    }
    int indexA = 0;
    int tmp = A;
    while (tmp != 0) {
        indexA++;
        tmp = tmp/10;
    }

    int indexB = 0;
    tmp = B;
    while (tmp != 0) {
        indexB++;
        tmp = tmp/10;
    }

    if ((A*pow(10,indexB)+B) > (B*pow(10,indexA)+A)) {
        return 1;
    }
    return -1;
}


#define MAX_LENGTH 4096
char * largestNumber(int* nums, int numsSize)
{
    char cNum[MAX_LENGTH] = {0};
    int index = 0;
    // 模擬堆棧
    int istack[10] = {0};
    int front = -1;

    qsort(nums, numsSize, sizeof(int), compare);
    int tmp;
    for (int i = numsSize; i > 0; i--) {
        tmp = nums[i-1];
        while (tmp !=0 )
        {
            istack[++front] = tmp % 10;
            tmp = tmp / 10;
        }
        if (front == -1) { // 元素爲0,沒有入棧
            cNum[index++] = '0';
        } else {            // 依次出棧
            while (front != -1)
            {
                cNum[index++] = '0' + istack[front--];
            }    
        } 
    }
    char *ret = (char *)malloc(index+1);
    memcpy(ret, cNum, index+1);
    if (atoi(ret) == 0) {
        return "0";
    }
    return ret;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章