思路
這道題的關鍵是設計比較函數,利用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;
}