我瞭解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