输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
回归C语言.
这道题的思路也是一个排序: 但是排序的依据是字符串衔接: s1 + s2 < s2 + s1, 那么判定s1比s2小
同时, 也学到了不少C语言的技巧: 虽然leetcode没有itoa, 但是可以使用sprintf()函数, 将内容打印到char*中. 当然也可以自己实现itoa:思路是先通过一个循环, 找到最高位的权重, 然后权重不断/=10
, 最高位是%=weight
C语言自带的qsort可以排序, 但是传入compare函数的两个变量都是指针!!
char* itoa(int x)
{
char *s = malloc(sizeof(char) * 10);
sprintf(s,"%d",x);
return s;
}
int compare(char **x, char **y)
{
char temp1[20], temp2[20];
sprintf(temp1, "%s%s", *x,*y);
sprintf(temp2, "%s%s", *y,*x);
return atol(temp1) - atol(temp2);
}
char* minNumber(int* nums, int numsSize){
if(numsSize == 1) return itoa(nums[0]);
char *result = malloc(sizeof(char) * numsSize * 10);
result[0] = 0;
char **cnums = malloc(sizeof(char*) * numsSize);
for(int i =0; i< numsSize;i++)
{
cnums[i] = itoa(nums[i]);
}
qsort(cnums, numsSize, sizeof(char*), compare);
for(int i = 0; i<numsSize;i++)
strcat(result, cnums[i]);
return result;
}
网友评论