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

题目描述

你要的最后一个字符就在下面这个字符串里,这个字符是下面整个字符串中第一个只出现一次的字符。(比如,串是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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值