被技术笔试在线编程题输入输出坑了的我,警醒大家注意这些!!!!!!(被百度,网易,腾讯笔试输入输出坑了的我提醒大家注意这些)
你是否还在为在线编程题输入输出而烦恼?
你是否还在为本地编译器通过而在线编程题总是无法通过而烦恼?
你是否还在为明明刷了很多算法题笔试成绩还是不理想而烦恼?
来这里就对啦!!!!!!!!!
我真的是被坑了若干次,感觉失去了好多机会啊,呜呜呜呜!!!!!
本人小白,目前已经刷了剑指offer的所有题目67道题,然后leetcode上也已经刷了240道题,虽然还比不上某些大佬,但觉得自己算法应该也还行了吧,笔试那不是轻松加愉快啊!!!!!可是,事实让我很失望。
百度笔试挂了,网易笔试挂了,腾讯笔试挂了,阿里笔试挂了(其实阿里不是因为输入输出啦,真的是题目有点难,还是自己的能力不足啊,啊啊啊啊啊),真的是很难受,总是出现下面的问题:
不通过
您的代码已保存
请检查是否存在数组越界等非法访问情况
case通过率为0.00%
数组越界,数组越界,这个问题当初弄得我真的是,心态崩了,调一个简单的题调不出来,后面的题由于心态崩了,也做不出来,最后导致笔试挂了。
出现数组越界等非法访问这个问题很可能就是你的输入输出写错了,不信的话,你可以把你的逻辑代码都注释掉,如果还是出现这个问题的话,就一定是输入输出写错了,而你又发现不了(如果注释掉就没有了,那可能还真是里面数组越界了,哈哈哈,那可能就具体问题具体分析了,当然这也是一种调试代码的方式,注释代码来定位出现问题的地方)
废话了这么多,下面来讲一下输入输出的写法吧,先来一段示例代码。
-
// 本题为考试单行多行输入输出规范示例,无需提交,不计分。
-
import java.util.*;
-
public
class Main {
-
public static void main(String[] args) {
-
//第一句就是从控制台来获取内容,这一句都会有,大概知道意思就可以了
-
Scanner in =
new Scanner(System.in);
-
while (in.hasNext()) {
// 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例
-
String N=in.nextLine();
-
}
-
}
-
}
获取里面的数据,有如下若干个方法:
(1)读一个整数
int n = sc.nextInt();
(2)读一个字符串
String s = sc.next();
(3)读一个浮点数
double t = sc.nextDouble();
(4)读一整行
String s = sc.nextLine();
(5)判断是否有下一个输入
sc.hasNext()
sc.hasNextInt()
sc.hasNextDouble()
sc.hasNextLine()
(6)输出
System.out.print();
System.out.println();
System.out.format();
System.out.printf();
方法的话其实也就是上面那么几个,看起来真的很简单,但是如果不做一下真题还真不知道里面的一些小坑。
我遇到的第一个坑,nextInt()与nextLine()互换使用的坑
下面是我第一版写得代码,不难,读者可以试着看一看问题出在哪里,自己找一找,可能印象会更深
-
// 本题为考试单行多行输入输出规范示例,无需提交,不计分。
-
import java.util.*;
-
public
class Main {
-
public static void main(String[] args) {
-
Scanner in =
new Scanner(System.in);
-
while (in.hasNext()) {
// 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例
-
int N=in.nextInt();
-
String string=in.nextLine();
-
//0N,1E,2S,3W
-
int count=
0;
-
char[] ch=string.toCharArray();
-
for(
int i=
0;i<ch.length;i++)
-
{
-
if(ch[i]==
'L')
-
{
-
count--;
-
if(count==-
1)
-
{
-
count=
3;
-
}
-
}
if(ch[i]==
'R')
-
{
-
count++;
-
if(count==
4)
-
{
-
count=
0;
-
}
-
}
-
}
-
if(count==
0)
-
{
-
System.out.println(
"N");
-
}
else
if(count==
1)
-
{
-
System.out.println(
"E");
-
}
else
if(count==
2)
-
{
-
System.out.println(
"S");
-
}
else
-
{
-
System.out.println(
"W");
-
}
-
}
-
}
-
}
揭晓答案:
问题出在int N=in.nextInt();
String string=in.nextLine();
这两句上,总是出现数组索引越界异常,问题就是第一句获取的是int,那么下一句再获取的nextLine其实获取的是这一行后面的内容,而不是下一行的内容,那么我们来测试一下:
-
// 本题为考试单行多行输入输出规范示例,无需提交,不计分。
-
import java.util.*;
-
public
class Main {
-
public static void main(String[] args) {
-
Scanner in =
new Scanner(System.in);
-
int a=in.nextInt();
-
String string=in.nextLine();
-
System.out.println(string);
-
}
-
}
输出
我仅仅输入一个2它就停止了,我还没输入其他内容呢,说明nextline()获取的就是它后面的那个内容啦,也就是空的内容。
这个问题是我被坑的最惨的一个问题了!!!!
解决方案:
最简单的就是空写一个nextline,或者前面的nextInt,直接用nextLine(),然后再字符串转int
我遇到的第二个坑,题目要求输入的范围其实是Long,但是我却输入的int导致数组越界异常,最开始的时候真的找了好久都没找到啊,读者可能会问到,这个问题很简单啊,怎么会出错,其实这个地方出错的原因是题目的表达上,题目表达的数据范围是10的18次方,开始刷题的时候没有注意,天真的以为2的32次方就是10的18次方,笔试的时候也没有计算器,因为平时记住的都是2的32次方,然后就怎么调也调不出来,其实2的32次方是10的9次方以下左右的可以用int,超过这些,就想一想是否要用更大的数据类型了。
我遇到的第三个坑,其实还是字符串和int的问题,题目输入是这样的
5
010101
011010
101101
第一行是一个int类型的数,用nextInt方法毋庸置疑,我在弄下面几行的时候,误以为它是数,中间有空格,然后就一直用nextInt方法了,导致出错,其实下面都是一个一个字符串,可以用nextLine方法,然后再toCharArray
这三个就是我从最开始笔试,到现在遇到的坑,开始的时候还不知道哪里错了,总是提示
数据越界,而且通过总是0
真的很烦
希望这篇文章可以帮到你,你还遇到过什么在线编程笔试的坑?欢迎留言!
关注微信公众号,获取更多java软件开发学习资源,覆盖java基础,android,网络编程,并发编程,mysql,linux,算法,以及C++和python书籍资源。
扫描下方二维码,或者搜索公众号你还有头发吗
转载:https://blog.csdn.net/qq_41901915/article/details/105823348