问题 J: 最大整数
时间限制: 1 Sec 内存限制: 128 MB
提交: 310 解决: 75
[提交] [状态] [讨论版] [命题人:外部导入]
题目描述
设有n个正整数(n<=20),将它们连接成一排,组成一个最大的多位数。
例如:n=3时,3个整数13,312,343连接成的最大整数为:34331213
又如:n=4时,4个整数7,13,4,246连接成的最大整数为7424613
输入
第1行,n;
第2行,n个数。
输出
连接成的多位数。
样例输入 Copy
<span style="color:#333333"><span style="color:#333333">3
13 312 343
</span></span>
样例输出 Copy
<span style="color:#333333"><span style="color:#333333">34331213</span></span>
提示
//前缀一样的情况下,需要根据长传后面串 轮回 比较短的那串
解法1:答案正确,算法仍需要优化,时间过长,内存过高。
import java.util.Scanner;
public class Main{
public static String[] ac = new String[1001];
public static int[] fg = new int[1001];
public static String[] cmp= new String[1001];
public static String stay="";
public static String refer="";
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
//System.out.println("************************");
for(int i=0;i<n;i++) {
ac[i]=String.valueOf(scan.nextInt());
//System.out.print(ac[i]+" ");
}
//System.out.println();
//System.out.println("*************************");
search(0,0,n);
System.out.println(refer);
}
static void search(int subscript,int counter,int num) {
for(int i = 0;i<num;i++) {
if(fg[i]==0) {
fg[i]=1;
cmp[subscript]=ac[i];
//System.out.println("*************************");
//System.out.println(ac[i]);
//System.out.println("*************************");
if(counter==(num-1)) {
compare(num);
}else {
search(subscript+1,counter+1,num);
}
fg[i]=0;
}
}
}
static void compare(int num) {
stay="";
for(int i=0;i<num;i++) {
stay+=cmp[i];
}
//System.out.println("-----------------");
//System.out.println(stay);
//System.out.println("-----------------");
if(stay.compareTo(refer)>0) {
//refer="";
refer=stay;
}
}
}
解法2:比较,类冒泡(类似于冒泡的排序,但比冒泡多了几重循环),在OJ上可以通过
package my;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class FindMax {
//public static String[] ac =new String[1001];
static List<String> ac = new ArrayList<>();
public static void main(String[] args) {
// TODO 自动生成的方法存根
//int a,b,c;
Scanner scan = new Scanner(System.in);
while(scan.hasNext()) {
int num = scan.nextInt();
for(int i=0;i<num;i++) {
//int receive = scan.nextInt();
ac.add(scan.next());
//ac[i]=String.valueOf(receive);
}
for(int i=0;i<num;i++) {
for(int j=0;j<num-1;j++) {
if(compare(ac.get(j),ac.get(j+1))) {
String temp=ac.get(j+1);
ac.set(j+1, ac.get(j));
ac.set(j, temp);
}
}
}
for(int k=0;k<num;k++) {
System.out.print(ac.get(k));
}
System.out.println();
ac.clear();
}
}
public static boolean compare(String a , String b) {
if((a+b).compareTo(b+a)<0) {
return true;
}else {
return false;
}
}
}