在洛谷练习P1116这一题时Java容易踩的坑

0x0001 起因

在刷这入门题(https://www.luogu.com.cn/problem/P1116)的时候,想不明白为什么明明代码在本地运行的好好的,为什么上测试之后一堆RE 
(最终解决的代码在底部)image.png https://www.luogu.com.cn/record/39958937
于是决定下载一下测试点数据检查一下。


0x0002 找原因

看了两次的测试点数据,发现了一个规律:

  • 在数字比较小的时候,测试输入内容为:
     image.png
  • 但是在输入数字比较大的时候,他却变成了分行输入
image.png

然后发现解题区域并无Java语言的答案,在看了几个CPP的答案之后,我发现了事情的原因。


0x0003 原因

由于Java语言中Scanner类的next()方法与nextLine()方法区别甚大,第一次我的输入功能的代码为:

Scanner in = new Scanner(System.in);
int num = Integer.valueOf(in.next());
String numbersStr = in.nextLine();

这里的in.nextLine()为读取一行,而在测试的时候,如果数字过多,会分行输入,所以并不能直接输入一行。 而数字小的时候,的确只有一行,这该怎么做呢?


0x0004 解决方法

使用Scanner的next()方法的特性,遇到空白字符则停止扫描 我们可以这样改进:

Scanner in = new Scanner(System.in);
int num = Integer.valueOf(in.next());
int[] nums = new int[num];
for(int i=0;i<num;i++) nums[i] = in.next();
//由于使用了next()方法,所以这就实现了循环用读取使用了任意空白字符(包括回车)分开的字符
//第一个数字为num(列车车厢个数)
//剩下的所有数字为列车车厢编号,循环存入int数组即可

0x0005 补充

使用这样的方法就可以成功的AC了 image.png
https://www.luogu.com.cn/record/39959384


代码:

import java.util.Scanner;

//洛谷题目:https://www.luogu.com.cn/problem/P1116

public class Main {

    /*
     *
     输入格式
    共两行。
    第一行是车厢总数N N(≤10000)。
    第二行是NN个不同的数表示初始的车厢顺序。

    输出格式
    一个整数,最少的旋转次数。

     * */
    public static void main(String [] args){

        Scanner in = new Scanner(System.in);
        //踩坑:这里需要用next(),否则在测试点都是RE,因为数字太多的话,机器会分行输入
        int num = Integer.valueOf(in.next());//第一个输入是有多少车厢
        int[] numsArr = new int[num];
        for(int i=0;i<num;i++) {
            numsArr[i] = Integer.valueOf(in.next());//第二个输入是车厢号
        }
        int times = 0;

        boolean flag = true;
        while(flag) {
            flag = false;//如果所有数字都是排序成功,就结束死循环
            for(int i=0;i<num-1;i++) {      
                if(numsArr[i] > numsArr[i+1]) {
                    times ++;
                    //如果i比i+1大,交换
                    int t = numsArr[i+1];
                    numsArr[i+1] = numsArr[i];
                    numsArr[i] = t;
                    flag = true;//有比任何数字大的,继续循环
                }
            }
        }
        System.out.println(times);

    }
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code