从蓝桥杯题目看Java输入问题

从蓝桥杯题目看Java输入问题就我目前有限的蓝桥杯做题经验来看,C/C++和Java的第一个区别就是输入。Java的输入相对比较困难,虽然Scanner已经提供了很多便利,能够接受多种类型的输入,但是在多行输入,尤其是包含空格,长度未知的输入情况下十分痛苦。。。以今天做到的一个问题为例:*问题描述某涉密单位下发了某种票据,并要在年终全部收回。每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始

就我目前有限的蓝桥杯做题经验来看,C/C++和Java的第一个区别就是输入。Java的输入相对比较困难,虽然Scanner已经提供了很多便利,能够接受多种类型的输入,但是在多行输入,尤其是包含空格,长度未知的输入情况下十分痛苦。。。
以今天做到的一个问题为例:
*问题描述
某涉密单位下发了某种票据,并要在年终全部收回。
每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。
因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。
你的任务是通过编程,找出断号的ID和重号的ID。
假设断号不可能发生在最大和最小号。
输入格式
要求程序首先输入一个整数N(N<100)表示后面数据行数。
接着读入N行数据。
每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000),请注意行内和行末可能有多余的空格,你的程序需要能处理这些空格。
每个整数代表一个ID号。
输出格式
要求程序输出1行,含两个整数m n,用空格分隔。
其中,m表示断号ID,n表示重号ID
样例输入1
2
5 6 8 11 9
10 12 9
样例输出1
7 9
样例输入2
6
164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196
172 189 127 107 112 192 103 131 133 169 158
128 102 110 148 139 157 140 195 197
185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190
149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188
113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119
样例输出2
105 120*
这个问题对数据输入处理的要求比较高(对java而言,C/C++的话直接一句gets()就能解决问题),之前想用for()循环套while(s.hasNext()){},然而while()一入深似海,再也出不来了。百度一下发现是.hasNext()对控制台的输入阻塞(就是说会停在这一步,直到输入EOF/Ctrl+Z结束这一步)的缘故。当然也可以用next()结束它,但是就这道题的要求而言似乎不可行。
最后在网上看到一个帖子提供了思路,原文见:

错误票据(蓝桥杯JavaB组预赛)
http://blog.csdn.net/c740869614/article/details/9252899

以下是对本题思路和注意点的总结:
1.输入:因为不管是一个一个数字.nextInt()读入还是一整行读入转为数组都很麻烦(反正我是想不出该怎么实现T^T),所以在整行读入String后再单独对这个String做处理。

            for(...){
            String ss=s.nextLine();
            Scanner line=new Scanner(ss);
            //因为是从字符串里读,所以不存在控制台读入碰到的结束符问题
            while(line.hasNext()){
  
  ...}
        }

接受来源是String的直接好处就是没有控制台那个无法结束循环的问题~
(这里发现自己知识的小漏洞,竟然不知道Scanner还可以有String这个参数,还是要熟悉API啊!)
另外,nextInt()这类不带Line的函数,用时要格外小心,读完自成一行的一个数字要读下一行数据时一定要加.nextLine()把回车换行搞掉,否则会出错。

2.算法:第一反应当然是要把数据放到数组里排序然后遍历啦。然而看了那篇帖子发现这个想法好蠢的说QAQ 。
我们的最终目的不是想动数据,而是知道数据出现的次数。所以只要能达到统计每个数出现的次数就大功告成啦~这个思路其实是比较重要的,这个思想跟哈希有什么关系我也不太清楚(对一些术语傻傻分不清楚,还求大神指教哇~)


        //存对所有数据的个数统计,数字大小不超过10000,故数组大小为10001
        int[] ary=new int[10001];
        ...
        int d=line.nextInt();
        ...
        ary[d]++;
        //在最小到最大之间遍历统计次数的数组,2次则重复,0次则缺失
            for(int j=min;j<=max;j++){
                if(ary[j]==0)
                    System.out.print(j+" ");
                if(ary[j]==2)
                    System.out.print(j+" ");
            }

欢迎指正,欢迎补充~

今天的文章从蓝桥杯题目看Java输入问题分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/27021.html

(0)
编程小号编程小号

相关推荐

发表回复

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