有关算法题的奇葩输入输出问题的解决办法

听说今年网易的笔试题目很难啊,“是啊,傻乎乎坐了两小时,没有然后了”
对于经常刷ACM的算法高手,肯定是不会对这篇博文感到好奇滴,但这个问题确实困扰了我一整场的笔试和一个晚上。

通常的算法题的题干会是这样:有n个数,两两组成二元组,差的绝对值最小的有多少对呢?差的绝对值最大的呢?;
然后题目的描述是这样的:对于每组测试数据: N - 本组测试数据有n个数 a1,a2…an - 需要计算的数据
我的逻辑:先让while(sc.hasNext()){}循环起来,再对每一例测试数据进行处理。

而奇葩的算法题的提干和描述是这样的:

好像没什么问题~算法也很简单嘛~那我就先开始写咯
while(sc.hasNext()){…}
漂亮!一旦你开始了,注定你这道题是不会做出来的了。

这里写图片描述
每一行的输入都会返回一个结果,这并不是题目所要求的。

让我们仔细看一下提干,“每个测试用例的第i行,表示完成第i件料理…”好像没有告诉我们每个测试用例会有几行,只是说,行数不超过50行。这我就懵了。我该如何控制程序的读入结束,转而对读入的数据进行处理呢?我总不能自己设结束标识吧,题目也没提示。笔试结束后,回到宿舍和同学们展开了激烈的讨论。“这题不是扯淡嘛”

其实并不然,问题还是有其他的解决办法。有经验的大神说了,“这是你们经验不足,手动式没法模拟的,测试用例的末尾会有EOF,所以可以大胆用Scanner”现在还是有点事后诸葛了,没办法去通过机器验证了,牛客网上的题目还没出来,只能自己YY一下先。

第一种解决方案:虽然实例中没有明显的结束标识,但我们可以假定两次回车键“\n”之后没有任何的字符串来判断用例已经结束。
其实今天要解决的就是这个问题啦。有经验的小伙伴都知道,如果通过Scanner.hasNext()去等待命令行的输入,这个方法是会自动过滤掉,空格,换行字符。那么问题就找到了,Scanner封装的时候并没有考虑到今天的情况。
解决方法一:避免使用Scanner.hasNext.用StringBuffer.readLine()来代替。
StringBuffer.readLine():判断输入是否回车,当遇到回车字符了,便将与上一个回车字符之间的字符串读入
代码如下:

s_set =new HashSet<>();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

        try {
            while (!(s=bufferedReader.readLine()).equals("") ) {
                s_array = s.split(" ");
                for (int i = 0; i  < s_array.length; i++) {

                        s_set.add(s_array[i]);
//                    System.out.println(s_array[i]);
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println(s_set.size());

解决方法二:其实Scanner也是有类似StringBuffer.readLine()的封装。而且我们还经常使用,Scanner.nextLine()和StringBuffer.readLine()有异曲同工之处。
代码如下:

        s_set =new HashSet<>();
            Scanner sc=new Scanner(System.in);
            while (!(s=sc.nextLine()).equals("") ) {
                s_array = s.split(" ");
                for (int i = 0; i  < s_array.length; i++) {
                        s_set.add(s_array[i]);
//                    System.out.println(s_array[i]);
                }
            }
        System.out.println(s_set.size());

两种方法效果一样
这里写图片描述

说到底,经常刷算法题目的大神是不会掉入这种小坑的。还是怪自己平时对这方面关注不够咯,惭愧。

其实在和室友讨论的时候还出现了第二种方案,机器输入用例的时间是很快的。所以可以根据时间上的等待时间来判断是否输入结束。但是手动模拟是不太好模拟的。等牛客网真题出了要再去试试!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值