笔试题 Java的输入输出

笔试题 Java的输入输出 Scanner用法

一、 概述

第一次笔试的时候不太熟悉Java的输入输出,会写的题目也没有AC。复盘的时候打算把Java的输入输出搞清楚。

一般笔试题输入,会分成一下几种情况:

  • 多行输入
    • 每行参数个数不确定
    • 每行参数个数确定
  • 单行输入
  • 输入输出量很大

下面的情况都是以Int举例,其他数据类型换成相应的读入方法即可。

前两种情况是输入输出量很小的情况,用Scanner一般不会超时,如果输入输出量很大的情况,Scanner就会超时,这个时候用BufferedReaderBufferedWriter比较好。

二、单行输入

先来看最简单的单行输入

主要是通过nextInt()不停地读入

  • 第一个数表示数组总数,后面的数表示数组的各个值
8 7 8 3 4 2 4 5 0
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()) {  // 牛客网推荐写法
            int n = in.nextInt();  // 数组总数
            int[] nums = new int[n];  // 创建数组
            for(int i = 0; i < n; i++) {
                nums[i] = in.nextInt();  // 读入数组元素
            }
        }
        in.close();
    }
}

三、多行输入

3.1 每行参数个数确定

这种情况也比较简单

以字节这次笔试的题目为例来讲

题目:

  • 第一行是一个正整数N(2<=N<=1000),表示数组长度
  • 第二行是N个数K1, K2, …, Kn 组成的环形数组,Kn 为0或1

也是通过 nextInt()

import java.util.Scanner;

public class ChooseSeat {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()) {
            int n = in.nextInt();   // 读第一行的参数
            int[] nums = new int[n];  // 创建数组
            for(int i = 0; i < n; i++) {
                nums[i] = in.nextInt();  // 不停的读入元素
            }
        }
        in.close();
    }
}

3.2 每行参数个数不确定

笔试的时候不知道这种情况怎么写,然后题没有写出来。

这种情况要next()nextLint() 一起用。

还是以字节的笔试题为例。

题目:

  • 第一行第一个数表示共有 N 个病毒,第二个数 R 表示分裂次数
  • 第二行第一个数表示共有几个致命病毒,后面的数表示致命病毒编号
  • 后面R行,第一个数表示祖先病毒编号,后几个数表示分裂出的子代病毒编号

比如说

 4   2    // 共有4个病毒,2次分裂
 2   2   3   // 共有2个致命的病毒,编号为2号和3号
 0   1   2  // 0号病毒分裂为1号和2号病毒
 1   3   // 1号病毒分裂为1号和3号病毒

前面两行比较好写,就是多行输入且每行参数个数确定

后R行,每行参数个数在这里插入代码片不确定,需要用到nextLine(),把这一行的所有数据都读进来,因为nextLine()读入的类型是String,还要通过分割String来去掉行内的空格“ ”,具体代码如下:

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
public class LowestCommonAncestor {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()) {
            int n = in.nextInt();  // 病毒总数
            int r = in.nextInt();  // 分裂次数
            int count = in.nextInt(); // 致命病毒数
            int[] deathVirIndex = new int[count];  // 创建数组
            for(int i = 0; i < count; i++) {
                deathVirIndex[i] = in.nextInt();   // 读数组元素
            }
            List<List<Integer>> index = new ArrayList<>();
            in.nextLine(); // 关键 要换行了
            while(in.hasNextLine()) {  // 一行一行读
                String str = in.nextLine();  // 读取一行只能是字符串
                String[] strIn = str.trim().split(" ");  // 以空格分割
                List<Integer> temp = new ArrayList<>();
                for(int j = 0; j < strIn.length; j++) {
                    temp.add(Integer.parseInt(strIn[j]));
                }
                index.add(new ArrayList<>(temp));
            }
        }
        in.close();
    }
}
输入:
4 2
2 2 3
0 1 2
1 3
得到的后R行List:[[0,1,2],[1,3]]

这里的关键点在于 in.nextLine(); ,读前面两行,用的是next(),读完后光标停在第二行末尾,需要换行才能到达第三行。

四、输入输出数据量大

BufferedReaderBufferedWriter可以加快读写效率。

4.1 BufferedReader

构造方法:

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

主要方法

int read(); //读取单个字符
int read(char[] cbuf, int off, int len); //将字符读到数组的一部分,返回读取的字符数
String readLine(); //读取一行
void close(); // 关闭流

4.2 BufferedWriter

构造方法

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));

主要方法

void write(char ch);  //写单个字符
void write(char []cbuf,int off,int len)  //写字符数据的某一部分
void write(String s,int off,int len) //写字符串的某一部分
void newLine()  //写一个行分隔符。

4.3 例子

输入:

1  // T组数据,每组4行
5  // n张桌子
01102  // 每张桌子人数
6   // m个排队的人
MFMMFF  // 排队人的性别

输出:每个人选几号桌

2
1
1
3
4
4
import java.util.*;
import java.io.*;
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
        int total = Integer.parseInt(reader.readLine());   // 组数T
        for(int i = 0; i < total; i++) {
            int n = Integer.parseInt(reader.readLine());   // 桌子数 n
            String strCount = reader.readLine();   // 每张桌子人数
            int[] count = new int[n];
            for(int j = 0; j < n; j++) {
                count[j] = Integer.parseInt(strCount.substring(j, j + 1));
            }
            int m = Integer.parseInt(reader.readLine());   // 人数 m
            String sex = reader.readLine();   // 排队人的性别
            int[] index = getIndex(n, count, m, sex);
            for(int in : index) {
                writer.write(Integer.toString(in));    // 输出数组的元素
                writer.newLine();   // 换行
            }
        }
        writer.flush();
    }
}
  • 8
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值