最大数

cover

主要是复习了sprintf函数,快速排序的灵活运用。

一、题干:

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

示例 1:

输入:nums = [10,2]
输出:”210”

示例 2:

输入:nums = [3,30,34,5,9]
输出:”9534330”

示例 3:

输入:nums = [1]
输出:”1”

示例 4:

输入:nums = [10]
输出:”10”

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 109

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解答:

题目难点在于解决先后排序问题:即在新的大小定义下调整顺序,用qsort函数加自定义比较函数cmp可以解决。

如何比较谁应该前置?我们可以先将相邻两个数链接组合,比较两种序列大小(比如12和3就应该比较123和312),选取较大数并将顺序重排。对整个数列操作后得到最大数列,再利用sprintf插入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
int cmp(int *a,int *b){

long p=10,q=10;

while(p<=*a)

p*=10;

while(q<=*b)

q*=10;

return (*b)*p+(*a)-((*a)*q+(*b));

}

char * largestNumber(int* nums, int numsSize){

for (int i = 0; i <= numsSize; i++){

if(i==numsSize)

return "0";

if(nums[i]!=0)

break;

}

char* ch=(char*)malloc(sizeof(char)*10000);

qsort(nums, numsSize, sizeof(int), cmp);

char *p = ch;//这里再次声明了一个字符指针p,是为了追踪每次sprintf后末尾的位置。

for (int i = 0; i < numsSize; i++) {

sprintf(p, "%d", nums[i]);

​ p += strlen(p);

}

return ch;

}

三、关于函数sprintf:

这个函数在C语言库的<stdio.h>中就有,以下是sprintf函数的声明:

1
int sprintf(char *str, const char *format, ...)

str–即是我们要写入的对象,指向一个字符数组

format–是一个字符串,包含了要被写入到字符串 str 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。

附加参数 – 根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。

如果成功,则会返回写入字符长度(不包含’\0’),失败返回一个负数。

详细说明链接:

https://www.runoob.com/cprogramming/c-function-sprintf.html