【发布时间】:2017-08-20 16:32:47
【问题描述】:
编写一个函数,给定一个非负整数列表,将它们排列成最大可能的数字。例如,给定 [0, 1, 2, 3],最大的形成数是 3210。
我理解的逻辑:
我们比较两个数字 XY(Y 附加在 X 的末尾)和 YX(X 附加在 Y 的末尾)。如果 XY 较大,则输出中 X 应该在 Y 之前,否则 Y 应该在之前。例如,让 X 和 Y 为 542 和 60。为了比较 X 和 Y,我们比较 54260 和 60542。由于 60542 大于 54260,我们将 Y 放在首位。我也可以为此编写代码。
让我惊讶的是这个解决方案:
#include <stdio.h>
#include<stdlib.h>
int swap(const void *c, const void *d) {
int n1 = *(int*)c;
int n2 = *(int*)d;
int a = pow(10, floor(log10(n2)) + 1) * n1 + n2;
int b = pow(10, floor(log10(n1)) + 1) * n2 + n1;
if (n1 == 0) return 1;
if (a < b) return 1;
return 0;
}
int main() {
int t = 0, tc = 0;
scanf("%d", &t);
for(tc = 1; tc <= t; tc++) {
int n;
scanf("%d",&n);
int arr[n];
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
qsort(arr, n, sizeof(int), swap);
for (int i = 0; i < n; i++)
printf("%d", arr[i]);
printf("\n");
}
return 0;
}
令我惊讶的是,它通过了所有测试用例。谁能给我解释一下这个逻辑?
【问题讨论】:
标签: arrays algorithm sorting quicksort