java如何解决OJ题目中的多case问题,解决本地IDE可以通过单个测试用例,OJ时显示通过了为0

之前在做OJ题目时也有遇到过这些问题,但是当时都没有去认真思考过,昨天做dji的笔试题,一道简单的字符串匹配问题,其大意就是一条指令对应一个动作,题目会给出指令和动作的映射,然后再给出几个询问的指令,希望我们输出指令对应的动作。其中指令和动作都是以字符串的形式给出的。

以下是输入具体格式:

第一行为两个整数,第一个代表映射的对数N,第二个代表询问的次数M,两个整数之间用空格分开;
之后的N行每一行都是一对映射,第一个字符串为指令,第二个字符串为对应的动作,同样以空格分开;
再之后的M行每一行对应一个查询的指令。

要求的输出格式:

N条查询指令需要输出N个对应的动作,每一行输出一个动作。

好了到这里楼主看完题目之后觉得这就是个送分题啊,具体思路就是把指令和动作存入Map中,指令做key,动作做value,然后根据查询的指令去查询Map即可。那么楼主很快的写出了第一版代码如下:

public static void main(String[] args) {
	// TODO 自动生成的方法存根
	Scanner sc=new Scanner(System.in);
	int mapNum=sc.nextInt();
	int queryNum=sc.nextInt();
	Map<String, String> mapp=new HashMap<String, String>();
	for(int i=0;i<mapNum;i++) {
		mapp.put(sc.next(), sc.next());
	}
	for(int i=0;i<queryNum;i++) {
		System.out.println(mapp.get(sc.next()));
	}
}

立马去本地IDE测试,这里我的测试用例是按照规则编的一个,具体如下:
4 4
abc left
edf up
ghi right
jkl down
abc
edf
ghi
jkl

那么正确的输出应该是:
left
up
right
down

我们看下我们的输出

这里运行测序,将测试用了粘贴到控制台,输出如下,此时注意看程序并没有运行结束,依然是个红色的小方框,我们再次按下enter键,输出变为如下:
在这里插入图片描述
这里有两个变化,输出和预期一致,但是我们这里会多出一行空格来,此时程序已经运行结束了。
那么按照我们的程序设计,就应该直接输出全部四个结果,这个问题调试的时候发现是在读取最后一条查询语句时,读取不到,Scaner的读入流被暂停了,我觉得这个可能属于多线程的问题,此时再按enter键就可以读入最后一个查询语句了,这个楼主也亲自调试过,不过受限于能力,源码实在看不懂,下图的是最后一次输出是next方法的调试界面,可以看到在输入enter后,token会被赋值为jkl,也就是最后一个查询指令,此时进入第一个if,返回的就是token,那么next方法就会返回jkl,如果不输入enter键,这里token就会得到null,程序就会被暂挂起来,具体还请大神指点。
在这里插入图片描述
那么我的解决办法就是把查询结果放入列表中,最后循环遍历列表进行输出:

public static void main(String[] args) {
	// TODO 自动生成的方法存根
	List<String> list=new ArrayList<>();
	Scanner sc=new Scanner(System.in);
	int mapNum=sc.nextInt();
	int queryNum=sc.nextInt();
	Map<String, String> mapp=new HashMap<String, String>();
	for(int i=0;i<mapNum;i++) {
		mapp.put(sc.next(), sc.next());
	}
	for(int i=0;i<queryNum;i++) {
		String tmp=mapp.get(sc.next());
		list.add(tmp);
	}
	for(int i=0;i<list.size();i++) {
		System.out.println(list.get(i));
	}
}

那么此时的输出结果就很完美了:
在这里插入图片描述
这个时候,再去线上OJ测试,发现case通过率依然为0,提示考虑多case情况,那么楼主就使用了while(hasNext())语法了,具体如下,此时case通过率就是100%啦。

	public static void main(String[] args) {
	// TODO 自动生成的方法存根
	List<String> list=new ArrayList<>();
	Scanner sc=new Scanner(System.in);
	while(sc.hasNext()) {
	int mapNum=sc.nextInt();
	int queryNum=sc.nextInt();
	Map<String, String> mapp=new HashMap<String, String>();
	for(int i=0;i<mapNum;i++) {
		mapp.put(sc.next(), sc.next());
	}
	for(int i=0;i<queryNum;i++) {
		String tmp=mapp.get(sc.next());
		list.add(tmp);
	}
	}
	for(int i=0;i<list.size();i++) {
		System.out.println(list.get(i));
	}
}

总结

我们在使用java的scaner类进行OJ测试时,为了应对多case情况,我们应该使用while(hasNext()){…}进行读取,那么对于最后一行输出无法正确输出的情况,我的建议是我们把输出数据先全部存起来,最后在while外面进行输出,这个时候牵扯到while(hasNext()){…}的强制退出问题,也就是C++里面的EOF问题,java中按Ctrl+Z组合键就可以了,如果无效的话,可能是电脑的其他软件如网易云或者有道等占用了Ctrl+Z组合键,关闭这些软件,或者在IDE中修改EOF默认按键即可,希望对广大应届生或者将要找工作的同学有帮助!

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页