数串问题:将n个正整数(最多三位)拼接组成一个最大的数

题目描述:

将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.执行结果如下:

猜你喜欢

转载自www.cnblogs.com/fanghuiplus/p/9448290.html