STM32 TIM4定时器中断详解:原理、配置与HAL/标准库实现
2026/10/5 7:32:43
在算法题中,“将一组数字拼接成最大整数”是经典的字符串排序类问题,比如给定数组[3,30,34,5,9],需拼接出9534330这个最大数。本文将基于提供的C语言代码,拆解解题核心思路、代码逻辑,以及背后的排序原理。
要拼接出最大数,关键误区是按数字本身大小排序(比如30比3大,但30拼接3是303,3拼接30是330,显然330更大)。因此核心原则是:
对任意两个数字a和b,比较
ab(a拼接b)和ba(b拼接a)的大小,若ba > ab,则b应排在a前面(降序)。
例如:
chararr[20][20];intn;arr[20][20]:二维字符数组,存储每个数字转换后的字符串(最多20个数字,每个数字转字符串最多20位);n:输入数字的个数。intcmp(constvoid*a,constvoid*b){charab[40],ba[40];strcpy(ab,(char*)a);strcat(ab,(char*)b);strcpy(ba,(char*)b);strcat(ba,(char*)a);returnstrcmp(ba,ab);// 降序排序}这是整个程序的核心,用于qsort(C标准库快速排序)的自定义排序规则:
a和b:指向arr中两个字符串的指针(即两个数字的字符串形式);ab:存储a拼接b的结果,ba:存储b拼接a的结果;strcmp(ba, ab):ba > ab,strcmp返回正数,qsort会将b排在a前面;ba < ab,返回负数,a排在b前面;strcmp默认升序,这里返回ba-ab的比较结果,实现降序排序)。intmain(){// 1. 输入数字个数scanf("%d",&n);// 2. 输入每个数字并转为字符串存入数组for(inti=0;i<n;i++){intnum;scanf("%d",&num);sprintf(arr[i],"%d",num);// 数字转字符串}// 3. 按自定义规则排序qsort(arr,n,sizeof(arr[0]),cmp);// 4. 拼接输出结果for(inti=0;i<n;i++)printf("%s",arr[i]);return0;}流程拆解:
n,再逐个读数字,通过sprintf将数字转为字符串(比如数字30→字符串"30"),存入arr;qsort,传入数组、元素个数、每个元素大小、自定义比较函数cmp,按“拼接结果最大”规则排序;输入:
5 3 30 34 5 9arr初始为:["3","30","34","5","9"];qsort按cmp规则排序:arr:["9","5","34","3","30"];9534330(正确)。原代码未处理“全0”场景(比如输入3 0 0 0),此时会输出000,但正确结果应为0。可添加优化:
// 排序后先判断第一个元素是否为0if(arr[0][0]=='0'){printf("0");return0;}代码中arr定义为20×20,适合数字个数≤20、单个数字位数≤20的场景,若需处理更大数据,可调整数组大小或改用动态内存分配。
该思路不仅适用于C语言,在Python、Java等语言中,解决“拼接最大数”问题的核心逻辑一致:自定义排序规则,比较两个元素的拼接结果。
这道题的核心是跳出“数值排序”的思维定式,转向“拼接结果排序”。C语言实现的关键在于利用qsort的自定义比较函数,将“拼接后更大”的规则转化为排序逻辑。理解这个核心思路后,不仅能解决该问题,还能举一反三处理类似的“自定义排序”算法题。