题目:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
思路:
最简单的就是直接把所有的拼接方法全排列出来,然后比较,得出最小的那一个。
这个题实际上是希望我们找到一个排序规则,数组根据这个排序规则来得到最小的这个数字。这其中两个数拼接成一个数,实际上也是一个典型的大数问题,面对大数问题我们最一想到就是转化成字符串来存储数。现在最关键的就是设定一个规则来确定最小数。(若拼接字符串 x + y > y + x,则 xx “大于” yy ;反之,若 x + y < y + x,则 xx “小于” yy ;x “小于” y 代表:排序完成后,数组中 x 应在 y 左边;“大于” 则反之。)
代码实现:
int compare(const void* a, const void* b) {
char tmp1[100] = "", tmp2[100] = "";
char *s1 = *(char**)a, *s2 = *(char**)b;
strcat(tmp1, s1);
strcat(tmp1, s2);
strcat(tmp2, s2);
strcat(tmp2, s1);
//return atoi(tmp1) - atoi(tmp2);
return atof(tmp1) - atof(tmp2);
}
char* minNumber(int* nums, int numsSize){
char** str = (char**)malloc(sizeof(char*) * numsSize);
for (int i = 0; i < numsSize; i++) {
str[i] = (char*)malloc(sizeof(char) * 20);
sprintf(str[i], "%d", nums[i]);
}
qsort(str, numsSize, sizeof(char*), compare);//快排
char* res = (char*)calloc(5000, sizeof(char));
for (int i = 0; i < numsSize; i++) {
strcat(res, str[i]);
}
return res;
}