我了解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
chux
如果您在提供给'qsort'的'compare'函数内使用'sprintf'和循环,则可能需要一整天和一天的时间。这个函数是为了简单地比较一个值,或者是在struct中有一个层次结构。但是你的“比较”函数似乎试图接管'qsort'的工作。也许你应该重新考虑算法。该解决方案可能会受益于递归方法。 –
@WeatherVane不同意 - 它仍然是一个日志问题,'sprintf()'只是形成了要比较的词典值。 – chux