算法之ACM输入格式,Java语言

2年前 (2022) 程序员胖胖胖虎阿
265 0 0

之前都是在leetcode上面刷题的, 熟悉的朋友都知道那是核心代码格式,非常方便,但是笔试面试的时候多为ACM格式,就是要自己处理输入输出的,尤其是输入格式,就学了学,写了写,记了记。

打个广告:我的个人博客网站:weilian

Java 基本输入输出

这部分知识是关于基本的控制台来实现输入输出。

Scanner类介绍

先简单的认识一下,若要通过控制台进行输入,首先需要构造一个与标准输入流System.in关联的Scanner对象。

Scanner sc = new Scanner(System.in);

然后就可以使用Scanner类的各种方法进行读取输入了,例如 **nextLine()**方法将读取一行输入。

String name = sc.nextLine();

Scanner类位于java.util包下,并是一个用final修饰的类,实现了Iterator, Closeable接口。

此类下一些常见的方法如下:

常用方法

返回类型 方法 方法描述
构造方法 Scanner(InputStream source) 构造一个新的 Scanner ,产生从指定输入流扫描的值
void close() 关闭此扫描仪
boolean hasNext() 如果此扫描仪在其输入中有另一个令牌,则返回true
boolean hasNextBigDecimal() 如果在此扫描器输入信息的下一个标记可以使用 nextBigDecimal()方法解释为BigDecimal,则返回true
boolean hasNextBigInteger() 如果在此扫描器输入信息的下一个标记可以使用默认基数 nextBigInteger()方法解释为BigInteger,则返回true
boolean hasNextBoolean() 如果此扫描器输入中的下一个标记可以使用从字符串true 或 false创建的不区分大小写的模式解释为布尔值,则返回true
boolean hasNextByte() 如果此扫描仪输入中的下一个标记可以使用 nextByte()方法将其 解释为默认基数中的字节值,则返回true
boolean hasNextDouble() 如果扫描仪的输入中的下一个标记可以使用 nextDouble()方法将其解释为双重值,则返回true
boolean hasNextFloat() 如果扫描仪输入中的下一个标记可以使用 nextFloat()方法将其解释为浮点值,则返回true
boolean hasNextInt() 如果此扫描仪输入中的下一个标记可以使用 nextInt()方法解释为默认基数中的int值,则返回true
boolean hatNextLine() 如果扫描仪的输入中有另一行,则返回true
boolean hasNextLong() 如果此扫描仪输入中的下一个标记可以使用 nextLong()方法将其 解释为默认基数中的长整型值,则返回true
boolean hasNextShort() 如果此扫描仪输入中的下一个标记可以使用 nextShort()方法将其 解释为默认基数中的一个短值,则返回true
String next() 查找并返回此扫描仪的下一个完整令牌
BigDecimal nextBigDecimal() 将输入的下一个标记扫描为BigDecimal
BigInteger nextBigInteger() 将输入的下一个标记扫描为BigInteger
boolean nextBoolean() 将输入的下一个标记扫描为布尔值,并返回该值
byte nextByte() 将输入的下一个标记扫描为 byte
double nextDouble() 将输入的下一个标记扫描为 double
float nextFloat() 将输入的下一个标记扫描为 float
int nextInt() 将输入的下一个标记扫描为 int
String nextString() 将此扫描仪推进到当前行并返回跳过的输入
long nextLong() 将输入的下一个标记扫描为 long
short nextShort() 将输入的下一个标记扫描为 short

关于next() 、 nextLine()

next() 不会扫描字符前/后的空格/Tab键,只扫描字符(字符前后不算) ,遇到空格/Tab结束

nextLine() 会扫描字符前/后的空格/Tab键,遇到回车结束

public static void main() {
    Scanner sc = new Scanner(System.in);
    
    // 键盘输入abc def gh
    
    // data1 = "abc"
    String data1 = sc.next();
    
    // data2 = "abc def gh"
    String data2 = sc.nextLine();
}

ACM

不同于核心代码格式(leetcode代码样式),ACM格式需要自己处理输入输出,尤其是输入。

ACM输入分为两种,单个测试数据输入,和多个测试数据输入。

单个测试数据输入,使用nextXxx()方法获取之后,调用自己的算法程序即可,如下:

public static void main() {
    Scanner sc = new Scanner(System.in);
    
    //先进行检测输入是否含有数据,实际其实可以不用写
    if(!sc.hasNext()) return; 
    
    //先进行读取String数据,再转化为int,boolean等数据(前提可转化)
    // 或者直接使用 int data = sc.nextInt()(前提输入可转为int)
    String data = sc.next(); 
    
    // 调用自己的算法程序    
  	
}

多个测试数据输入,一般需使用while(xx.hasNext()) {} 先进行检测有无输入数据,有的话,进行nextxxx()方法进行读取到单个输入数据,然后调用自己的算法程序即可,如下:

public static void main() {
    
    Scanner sc = new Scanner(System.in);
    
    while(sc.hasNext()) {
        String data = sc.next();
        
        // 调用自己的算法程序 
    }
}

单个数据输入

基本数据类型输入

两种方式,使用nextxxx()直接获取对应的数据类型 或 先使用next() nextLine()获得String类型,再转化为对应的数据类型。

方式一:直接获取

public statci void main() {
    Scanner sc = new Scanner(System.in);
    
    //若下次扫描的内容可以通过nextInt()转化为整数,则返回true,进入if
    if (sc.hasNextInt()) int dataInt = sc.nextInt();
    
    //若下次扫描的内容可以通过nextFloat()转化为浮点数,则返回true,进入if
    if (sc.hasNextFloat()) float dataFloat = sc.nextFloat();
    
    
    if (sc.hasNextShort()) short dataShort = sc.nextShort();
    
    if (sc.hasNextLong()) long dataLond = sc.nextLong();
    
    if (sc.hasNextDouble) double dataDouble = sc.nextDouble();
    
    if (sc.hasNextByte()) byte dataByte = sc.nextByte();
    
    // 注意boolean 输入 需要为 true 或者 false ,输入其他都是false
    if (sc.hasNextBoolean()) boolean dataBoolean = sc.nextBoolean();
    
    if (sc.hasNextBigDecimal()) BigDecimal dataBigDecima = sc.nextBigDecima();
    
    if (sc.hasNextBigInteger()) BigInteger dataBigInteger = sc.nextBigInteger();
    
    //char 不同,Scanner本身没有支持获取char类型的数据,但是可以按照如下方式进行获取
    if (sc.hasNext()) char dataChar = sc.next().charAt(0);
    
}

方式二:获取再转化

public statci void main() {
    Scanner sc = new Scanner(System.in);
    
    String data = sc.next();
    
    //转化前提:可以被转化
    //比如 "1" -> 1 (int) 可以
    //"a" -> 1 (int) 不可以
    
    int dataInt = Integer.parseInt(data);
    
    float dataFloat = Float.parseFloat(data);
    
    short dataShort = Short.parseShort(data);
    
    Long dataLong = Long.parseLong(data);
    
    boolean dataBoolean = Boolean.parseBoolean(data);
    
    char dataChar = data.charAt(0);
    
    double dataDouble = Double.parseDouble(data);
    
    BigDecimal dataBigDecimal = new BigDecimal(data);
    
    BigInteger dataBigInteger = new BigInteger(data);
}

数组类型输入

不定长 以空格,逗号等隔开

输入示例如下:

1 2 3 4 5 6 7 …

将输入的作为测试数组。

可按照以下程序进行处理:

public static void main() {
    Scanner sc = new Scanner(System.in);

    // 空格隔开--split(" ")
    // 逗号隔开--split(",")
    String[] datas = sc.nextLine().split(" ");
    
    
    int[] data = new int[datas.length];
    
    for(int i = 0; i < datas.length; i++){
        data[i] = Integer.parseInt(datas[i]);
    }

    System.out.println(Arrays.toString(data));
    
    //接下来调用自己的算法程序
    
}

定长,给长度

输入示例如下:

5

1 2 3 4 5

第一行为数组长度,将第二行输入的作为测试数组。

可按照以下程序进行处理

public statci void main() {
    Scanner sc = new Scanner(System.in);
    int len = sc.nextInt();
    int[] data = new int[len];
    for (int i = 0; i < len; i++){
        data[i] = sc.nextInt();
    }
    
    System.out.println(Arrays.toString(data));
    
     //接下来调用自己的算法程序
}

链表类型输入

二叉树类型输入

多个数据输入

【未完持续…】

版权声明:程序员胖胖胖虎阿 发表于 2022年11月3日 上午10:16。
转载请注明:算法之ACM输入格式,Java语言 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...