奇虎360——最后一个字符(利用BufferedReader输入数据)

时间:2022-05-07 22:41:21

题目描述

你要的最后一个字符就在下面这个字符串里,这个字符是下面整个字符串中第一个只出现一次的字符。(比如,串是abaccdeff,那么正确字符就是b了)
题目要求输入文件体积较大,请使用一些快速的输入输出手段,不推荐使用cin/cout,对Java并不推荐使用Scanner直接读写。 
输入描述:
第一行,一个正整数T(T≤20)  ,表示输入数据组数。
之后T行,每行一个字符串S。( 1≤S 的长度≤1000000 ,保证字符串中出现的字符的ASCII码在[0x21,0x7F)范围内,即均为可显示的非空白符,同时保证一定有解)
输出描述:
一共T 行,每行一个字符C ,表示所给的相应字符串中第一个只出现一次的字符。
输入例子:
2
abaccdeff
testonline
输出例子:
b
s
分析:需要注意的就是利用BufferedReader从控制台输入数据的方法

BufferedReader in=new BufferedReader(new InputStreamReader(System.in));

System.in方法的描述:

in

public static final InputStream in  可以看出是字节流

BufferedReader要处理的是字符流,所以要利用InputStreamReader()进行字节流到字符流的转换。
BufferedReader读取的方式readLine()的描述:

readLine

public String readLine()
throws IOException
读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。

返回:
包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
抛出:
IOException - 如果发生 I/O 错误
读取的是字符串类型,所以还要Integer.parseInt(Sting s)进行类型的转换。利用while((s=in.readLine())!=null)判断是否读取到文件流的末尾,当读到文件流末尾的时候返回null给s。

import java.util.*;
import java.io.*;//文件流引入io包,减少笔试编译次数
public class Main{
public static void main(String[] args)throws Exception
{
//控制台输入数据BufferedReader
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
String s="";
while((s=in.readLine())!=null)//readLine()读取返回字符串,若读取到文件末尾,返回null。
{
int count=Integer.parseInt(s);
for(int i=0;i<count;i++)
{
String ss=in.readLine();
char c=firstChar(ss);
System.out.println(""+c);
}
}
in.close();
}
//字符串中找到第一个只出现一次字符的例程
public static char firstChar(String s)
{
HashMap<Character,Integer> map=new HashMap();
for(int i=0;i<s.length();i++)
{
if(!map.containsKey(s.charAt(i)))
{
map.put(s.charAt(i),1);
}else
{
map.put(s.charAt(i),map.get(s.charAt(i))+1);
}
}
char c=s.charAt(0);
for(int i=0;i<s.length();i++)
{
if(map.get(s.charAt(i)) == 1)
{
c=s.charAt(i);
break;
}
}
return c;
}
}