代码输出不符预期:数组排序生成最大数字问题排查
数组拼接最大数字问题排查
我正在完成极客时间挑战的第三题,题目要求编写函数对正整数数组排序,使其拼接后得到最大数字(例如[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); } }
代码存在的核心问题
排序逻辑不完整
你的SortMe方法只做了一轮相邻元素交换,这只是冒泡排序的单次遍历,无法实现数组的全局有序。比如测试用例中的97,仅一轮交换只能从最后一位挪到倒数第二位,根本没法移动到50前面,自然得不到正确顺序。比较逻辑完全错误
你写的Rec函数试图通过递归取高位、再取低位的方式对比数字,但这完全不符合题目要求的拼接优先级。题目核心判断逻辑应该是:两个数a和b,谁放在前面能让拼接后的数字更大,谁就排在前面,正确的做法是直接对比a+b和b+a这两个拼接后的字符串大小,比如:
- 对比
9和97:看"9"+"97"(即997)和"97"+"9"(即979),前者更大,所以9要排在97前面 - 对比
50和97:看"9750"和"5097",前者更大,所以97要排在50前面
- 递归比较的逻辑缺陷
即使不考虑拼接优先级,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
相关产品推荐
相关产品推荐

