题目描述:
将n个正整数(最多三位)连接组成一个最大的数
输入:
5
45 67 98 29 291
输出:
98674529291
思路(以上面测试用例为准):
1.错误方法:
首先我想到的是将这5个整数根据字符进行排序,再将排序后的结果连接起来,就组成了一个最大值,但是这种方法是错误的,如下:
使用Arrays.sort()进行排序
45 67 98 29 291的排序结果为98 67 45 291 29
组合起来的数就是98674529129
显然是比98674529291要来的小,只能通过一部分的测试用例,如同29 291这样的就会出现错误
2.改进方法:
改进思路:
既然有29 291类似的会出错,那么就想办法把29排在291前面
创建一个二维数组:
第一行为那n个正整数
第二行数的规则为:
for (int i=n-1;i>=0;i--) { strmiddle[i][0] = Integer.parseInt(str[i]); if(str[i].length()==1){ strmiddle[i][1] = Integer.parseInt(str[i]+str[i].charAt(0)+str[i].charAt(0)); } if(str[i].length()==2){ strmiddle[i][1] = Integer.parseInt(str[i]+str[i].charAt(0)); } if(str[i].length()==3){ strmiddle[i][1] = Integer.parseInt(str[i]); } }
即有下面二维数组:
45 67 98 29 291
454 676 989 292 291
转化规则如下面例子:
若arr[0][i] = 4,那么arr[1][i] = 444
若arr[0][i] = 54,那么arr[1][i] = 545
若arr[0][i] = 789,那么arr[1][i] = 789
然后再根据第二行的数进行排序,再将第一行的数连接起来就是最大的数
即98674529291
3.错误以及进一步改进:
依然存在问题
对于53 535两个数,转化的数都为535,显然535应该排在53前面
所以先对二维数组第一行使用Array.sort()进行排序
再对数组第二行使用稳定的排序(冒泡排序等)或者再次使用重写的Array.sort()(经过测试也是稳定的,@override代码如下)
Arrays.sort(strmiddle,new Comparator<Integer[]>() { @Override public int compare(Integer[] x, Integer[] y) { if(x[1] < y[1]){ return 1; } else if(x[1] >= y[1]){ return -1; } else { return 0; } } });
再将第一行得数按顺序拼接起来就是最大的数
4.具体代码如下:
package test; import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; public class Nums { public static void main(String args[]) { @SuppressWarnings("resource") Scanner scan = new Scanner(System.in); System.out.println("请输入n:"); int n = scan.nextInt(); int [] num = new int[n]; String []str = new String[n]; Integer [][]strmiddle = new Integer[n][2]; System.out.println("请输入"+n+"个整数:"); for (int i=0;i<n;i++) { num[i] = scan.nextInt(); //将int转化为string str[i] = String.valueOf(num[i]); } Arrays.sort(str); StringBuffer result = new StringBuffer(""); System.out.println("排序结果为:"); for (int i=n-1;i>=0;i--) { System.out.print(str[i]+" "); strmiddle[i][0] = Integer.parseInt(str[i]); if(str[i].length()==1){ strmiddle[i][1] = Integer.parseInt(str[i]+str[i].charAt(0)+str[i].charAt(0)); } if(str[i].length()==2){ strmiddle[i][1] = Integer.parseInt(str[i]+str[i].charAt(0)); } if(str[i].length()==3){ strmiddle[i][1] = Integer.parseInt(str[i]); } } Arrays.sort(strmiddle,new Comparator<Integer[]>() { @Override public int compare(Integer[] x, Integer[] y) { if(x[1] < y[1]){ return 1; } else if(x[1] >= y[1]){ return -1; } else { return 0; } } }); System.out.println("\nstrmiddle[][]:"); for (int i=0;i<n;i++) { System.out.print(strmiddle[i][0]+" "); System.out.print(strmiddle[i][1]+"\n"); result.append(strmiddle[i][0]); } System.out.println("最终结果为:\n"+result); } }
5.执行结果如下: