0x0001 起因
在刷这入门题(https://www.luogu.com.cn/problem/P1116)的时候,想不明白为什么明明代码在本地运行的好好的,为什么上测试之后一堆RE
(最终解决的代码在底部) https://www.luogu.com.cn/record/39958937
于是决定下载一下测试点数据检查一下。
0x0002 找原因
看了两次的测试点数据,发现了一个规律:
- 在数字比较小的时候,测试输入内容为:
- 但是在输入数字比较大的时候,他却变成了分行输入
然后发现解题区域并无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了
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); } }