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

代码输出不符预期:数组排序生成最大数字问题排查

数组拼接最大数字问题排查

我正在完成极客时间挑战的第三题,题目要求编写函数对正整数数组排序,使其拼接后得到最大数字(例如[50,9,1,2]应得到95021)。以下是我的代码,运行后预期输出为99750188,但实际输出是95097188,请问代码存在什么问题?

public class HelloWorld
{
    public static int Rec(int num1,int num2)
    {
        if(num1<10&&num2<10)
        {
            if(num1==num2)
                return 0;
            if(num1==Math.Max(num1,num2))
                return 1;
            return 2;
        }
        if(num1>10)
            num1/=10;
        if(num2>10)
            num2/=10;
        return Rec(num1,num2);
    }
    public static void SortMe(int[] arr)
    {
        for(int i=0;i<arr.Length-1;i++)
        {
            int check=Rec(arr[i],arr[i+1]);
            int temp1=arr[i];
            int temp2=arr[i+1];
            while(check==0&&(temp1>10||temp2>10))
            {
                if(temp1>10)
                    temp1%=10;
                if(temp2>10)
                    temp2%=10;
                check=Rec(temp1,temp2);
            }
            if(check==2)
            {
                int temp3=arr[i];
                arr[i]=arr[i+1];
                arr[i+1]=temp3;
            }
        }
    }
    public static void MaxNumber(int[] arr)
    {
        SortMe(arr);
        for(int i=0;i<arr.Length;i++)
            Console.Write(arr[i]);
    }
    public static void Main(string[] args)
    {
        //Console.WriteLine ("Hello Mono World");
        int[] arr=new int[4];
        arr[0]=50;
        arr[1]=9;
        arr[2]=188; 
        arr[3]=97;
        MaxNumber(arr);
    }
}

代码存在的核心问题

  1. 排序逻辑不完整
    你的SortMe方法只做了一轮相邻元素交换,这只是冒泡排序的单次遍历,无法实现数组的全局有序。比如测试用例中的97,仅一轮交换只能从最后一位挪到倒数第二位,根本没法移动到50前面,自然得不到正确顺序。

  2. 比较逻辑完全错误
    你写的Rec函数试图通过递归取高位、再取低位的方式对比数字,但这完全不符合题目要求的拼接优先级。题目核心判断逻辑应该是:两个数a和b,谁放在前面能让拼接后的数字更大,谁就排在前面,正确的做法是直接对比a+b和b+a这两个拼接后的字符串大小,比如:

  • 对比9和97:看"9"+"97"(即997)和"97"+"9"(即979),前者更大,所以9要排在97前面
  • 对比50和97:看"9750"和"5097",前者更大,所以97要排在50前面
  1. 递归比较的逻辑缺陷
    即使不考虑拼接优先级,Rec函数也无法处理长度不同的数字对比,比如9和97,9只有一位,你的逻辑会拿9和97的高位9对比返回相等,后续取9的低位(实际不存在)和97的低位7对比时,逻辑不成立,根本没法正确判断顺序。

修正后的代码示例

直接用自定义比较器实现正确排序逻辑,同时处理全0的特殊情况:

public class HelloWorld
{
    public static void MaxNumber(int[] arr)
    {
        // 自定义比较器:以拼接后的字符串大小为判断依据,降序排列
        Array.Sort(arr, (a, b) => {
            string concatAB = a.ToString() + b.ToString();
            string concatBA = b.ToString() + a.ToString();
            return concatBA.CompareTo(concatAB);
        });

        // 处理数组全为0的特殊情况,避免输出多个0
        if (arr[0] == 0)
        {
            Console.WriteLine(0);
            return;
        }

        // 拼接输出结果
        foreach (int num in arr)
        {
            Console.Write(num);
        }
    }

    public static void Main(string[] args)
    {
        int[] arr = new int[4];
        arr[0] = 50;
        arr[1] = 9;
        arr[2] = 188; 
        arr[3] = 97;
        MaxNumber(arr); // 输出:99750188
    }
}

内容的提问来源于stack exchange,提问作者Ayala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:47:24