题目
问题描述
给定一些字符串(只包含小写字母),要求将他们串起来构成一个字典序最小的字符串。
输入格式
第一行T,表示有T组数据。
接下来T组数据
每组第一行一个正整数n,表示字符串个数。
接下来n行,每行一个字符串(长度不超过100)。
输出格式
T行,每行一个字符串。
样例输入
1
3
a
b
c
样例输出
abc
数据规模和约定
T<=7000,n<=100;
思路:贪心+排序+输入优化
这次排序的核心是比较:S1+S2大还是S2+S1大,就比如说S1:ba S2:b。虽然正常来说应该是S2<S1,但是这道题应该是S1<S2------bab<bba。
第一次AC代码:
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main
{
public static void main(String[] args) throws IOException {
Scanner in=new Scanner(System.in);
int T=in.nextInt();int n;
String[] s;
for(int i=0;i<T;i++)
{
n=in.nextInt();
s=new String[n];
for(int j=0;j<n;j++)
{
s[j]=in.next();
}
Arrays.sort(s,new Comparator<String>() {
public int compare(String o1, String o2) {
return (o1+o2).compareTo(o2+o1);
};
});
for(int j=0;j<n;j++)
System.out.print(s[j]);
System.out.println();
}
}
}
第二次改进版
仅仅是优化了输入。将Scanner改为StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;
import java.util.Comparator;
public class Main
{
public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
in.nextToken();
int T=(int)in.nval;int n;
String[] s;
for(int i=0;i<T;i++)
{
in.nextToken();
n=(int)in.nval;
s=new String[n];
for(int j=0;j<n;j++)
{
in.nextToken();
s[j]=in.sval;
}
Arrays.sort(s,new Comparator<String>() {
public int compare(String o1, String o2) {
return (o1+o2).compareTo(o2+o1);
};
});
for(int j=0;j<n;j++)
System.out.print(s[j]);
System.out.println();
}
}
}
时间得到了一定的优化。
这个题还有一个优化的地方就是你要注意数据规模,我一开始习惯用parallelSort()。但是数据规模是小于100,其实用sort更快。我看到了一个7000,那只是7000组数据,数组内只有不到100个数据。这是排序函数的选择。
还有就是看到许多其他博主说String和StringBuilder和StringBuffered。其实我一开始用的StringBuilder,因为是单线程这个更快嘛。然后我把排序好的数组一个个追加到StringBuilder中,我现在真觉得是费力不讨好,最后当然也是内存超限。直接打印排序好的数组就完了。
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
利用Scanner类进行输入时正常情况下都是是够用。不过当输入量和输出量太大的时候(达到百万到千万),那么这种输入方式效率就很低。这时候可以用StreamTokenizer类。本题中虽然没有到百万级,但是这个类也优化了不少时间和空间。