【发布时间】:2017-07-29 14:03:18
【问题描述】:
我了解到compare 函数正在对值进行排序,以便以降序显示数字组合。
例如:给定[3, 30, 34, 5, 9],最大的形成数是9534330。
int compare(const void *a1,const void *b1){
int a = *(int*)a1;
int b = *(int*)b1;
int i=0;
char arr[10000]={0};
char brr[10000]={0};
sprintf(arr, "%d%d", a, b);
sprintf(brr, "%d%d", b, a);
int k = strlen(arr);
for(i=0; i < k; i++){
if(arr[i] != brr[i])
return brr[i] - arr[i];
}
return b-a;
}
char* largestNumber(const int* A, int n1) {
char *ans = (char*) calloc(10000000,sizeof(char));
int i=0, count=0;
qsort(A, n1, sizeof(int), compare);
if(A[0] == 0){
ans[0] = '0'; ans[1]=0; return ans;
}
for(i=0; i<n1; i++){
int k = A[i];
// printf("%d ", k);
count += sprintf(ans+count, "%d", k);
}
// printf("\n");
ans[count] = 0;
return ans;
}
我的疑惑如下:
-
这段代码是如何工作的?
for(i=0; i < k; i++){ if(arr[i] != brr[i]) return brr[i] - arr[i]; }它正在比较
arr和brr的内容,但它是如何返回值以便以这种方式对值进行排序的? 即使它返回值,它们也应该按升序打印。为什么按降序显示?
【问题讨论】:
-
注:1)可以使用
int k = sprintf(arr, "%d%d", a, b);“sprintf函数返回写入数组的字符数,不计算终止的空字符,如果发生编码错误,则返回负值。” 2)char arr[10000]={0};相当极端,也许是char arr[100]={0};? 3) 整个for(i=0; i < k; i++){ if(arr[i] != brr[i]) ...看起来类似于strcmp()。 -
如果您使用
sprintf并在提供给qsort的compare函数内循环,则可能需要永远和一天。该函数旨在对值进行简单比较,或者如果struct中有层次结构,则进行几个比较。但是您的compare函数似乎正试图接管qsort的工作。也许你应该重新考虑算法。该解决方案可能会受益于递归方法。 -
@WeatherVane 不同意 - 这仍然是一个 n log n 问题。
sprintf()只是形成要比较的字典值。 -
@chux,也许我在你发帖的时候又加了一句。
-
分配一千万个字符的空间来记录答案似乎有点过分,尽管我想这在一定程度上取决于
n1的大小和范围在输入数组的元素上。