数组最大拼接数算法故障排查及简易解法咨询
失败测试用例
以下是几个容易触发逻辑错误的测试用例,你的MSD排序逻辑可能未覆盖这些场景:
- 全零输入:
n=4,元素=[0,0,0,0],正确输出应为0(而非0000) - 重复前缀的长短数字混合:
n=3,元素=[9,90,91],正确输出是99190 - 多段重复前缀的复杂组合:
n=4,元素=[12,121,1213,1212],正确输出为12131212121 - 短数字前缀覆盖长数字:
n=2,元素=[22,221],正确输出是22221
无需复杂数据结构的最优解法
核心思路是自定义字符串拼接比较规则,完全不需要MSD这类复杂排序逻辑,用C语言标准库的qsort就能实现:
- 将所有数字转换为字符串存储(方便直接拼接比较)
- 自定义排序的比较函数:对于两个字符串
a和b,比较a+b与b+a的字典序,哪个更大就把对应的字符串排在前面(降序排列) - 排序完成后拼接所有字符串,最后处理全零特殊情况(如果拼接结果首字符是
'0',直接输出"0")
C语言代码示例
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LEN 20 int compare(const void *a, const void *b) { char ab[MAX_LEN], ba[MAX_LEN]; strcpy(ab, *(const char**)a); strcat(ab, *(const char**)b); strcpy(ba, *(const char**)b); strcat(ba, *(const char**)a); // 降序排列,返回ba - ab的字典序比较结果 return strcmp(ba, ab); } int main() { int n; scanf("%d", &n); char **strs = (char**)malloc(n * sizeof(char*)); for (int i = 0; i < n; i++) { strs[i] = (char*)malloc(MAX_LEN * sizeof(char)); scanf("%s", strs[i]); } qsort(strs, n, sizeof(char*), compare); // 处理全零情况 if (strs[0][0] == '0') { printf("0\n"); } else { for (int i = 0; i < n; i++) { printf("%s", strs[i]); } printf("\n"); } // 释放内存 for (int i = 0; i < n; i++) { free(strs[i]); } free(strs); return 0; }
这个解法的关键在于,直接通过拼接后的结果判断两个数字的优先级,完全规避了常规排序或MSD排序无法处理的「短数字与长数字前缀相同」的场景,逻辑简洁且高效。
内容的提问来源于stack exchange,提问作者Siddhanta Mallick
相关产品推荐
相关产品推荐

