You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组最大拼接数算法故障排查及简易解法咨询

失败测试用例

以下是几个容易触发逻辑错误的测试用例,你的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就能实现:

  1. 将所有数字转换为字符串存储(方便直接拼接比较)
  2. 自定义排序的比较函数:对于两个字符串a和b,比较a+b与b+a的字典序,哪个更大就把对应的字符串排在前面(降序排列)
  3. 排序完成后拼接所有字符串,最后处理全零特殊情况(如果拼接结果首字符是'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:25:18