最小字符串 蓝桥杯算法提高 -Java实现

题目

问题描述
  给定一些字符串(只包含小写字母),要求将他们串起来构成一个字典序最小的字符串。
输入格式
  第一行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类。本题中虽然没有到百万级,但是这个类也优化了不少时间和空间。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值