飞道的博客

被百度,网易,腾讯技术笔试在线编程题输入输出坑了的我提醒大家注意这些!!!(不看这些就算leetcode,剑指offer刷了再多也没有,呜呜呜呜!!!)

441人阅读  评论(0)

被技术笔试在线编程题输入输出坑了的我,警醒大家注意这些!!!!!!(被百度,网易,腾讯笔试输入输出坑了的我提醒大家注意这些)

你是否还在为在线编程题输入输出而烦恼?

你是否还在为本地编译器通过而在线编程题总是无法通过而烦恼?

你是否还在为明明刷了很多算法题笔试成绩还是不理想而烦恼?

来这里就对啦!!!!!!!!!

我真的是被坑了若干次,感觉失去了好多机会啊,呜呜呜呜!!!!!

 

本人小白,目前已经刷了剑指offer的所有题目67道题,然后leetcode上也已经刷了240道题,虽然还比不上某些大佬,但觉得自己算法应该也还行了吧,笔试那不是轻松加愉快啊!!!!!可是,事实让我很失望。

百度笔试挂了,网易笔试挂了,腾讯笔试挂了,阿里笔试挂了(其实阿里不是因为输入输出啦,真的是题目有点难,还是自己的能力不足啊,啊啊啊啊啊),真的是很难受,总是出现下面的问题:

不通过

您的代码已保存
请检查是否存在数组越界等非法访问情况
case通过率为0.00%

数组越界,数组越界,这个问题当初弄得我真的是,心态崩了,调一个简单的题调不出来,后面的题由于心态崩了,也做不出来,最后导致笔试挂了。

出现数组越界等非法访问这个问题很可能就是你的输入输出写错了,不信的话,你可以把你的逻辑代码都注释掉,如果还是出现这个问题的话,就一定是输入输出写错了,而你又发现不了(如果注释掉就没有了,那可能还真是里面数组越界了,哈哈哈,那可能就具体问题具体分析了,当然这也是一种调试代码的方式,注释代码来定位出现问题的地方)

废话了这么多,下面来讲一下输入输出的写法吧,先来一段示例代码。


  
  1. // 本题为考试单行多行输入输出规范示例,无需提交,不计分。
  2. import java.util.*;
  3. public class Main {
  4. public static void main(String[] args) {
  5. //第一句就是从控制台来获取内容,这一句都会有,大概知道意思就可以了
  6. Scanner in = new Scanner(System.in);
  7. while (in.hasNext()) { // 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例
  8. String N=in.nextLine();
  9. }
  10. }
  11. }

获取里面的数据,有如下若干个方法:

(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()互换使用的坑

这里我们来一道题来试一下:https://www.nowcoder.com/practice/fc72d3493d7e4be883e931d507352a4a?tpId=98&tqId=32827&tPage=1&rp=1&ru=/ta/2019test&qru=/ta/2019test/question-ranking

下面是我第一版写得代码,不难,读者可以试着看一看问题出在哪里,自己找一找,可能印象会更深


  
  1. // 本题为考试单行多行输入输出规范示例,无需提交,不计分。
  2. import java.util.*;
  3. public class Main {
  4. public static void main(String[] args) {
  5. Scanner in = new Scanner(System.in);
  6. while (in.hasNext()) { // 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例
  7. int N=in.nextInt();
  8. String string=in.nextLine();
  9. //0N,1E,2S,3W
  10. int count= 0;
  11. char[] ch=string.toCharArray();
  12. for( int i= 0;i<ch.length;i++)
  13. {
  14. if(ch[i]== 'L')
  15. {
  16. count--;
  17. if(count==- 1)
  18. {
  19. count= 3;
  20. }
  21. } if(ch[i]== 'R')
  22. {
  23. count++;
  24. if(count== 4)
  25. {
  26. count= 0;
  27. }
  28. }
  29. }
  30. if(count== 0)
  31. {
  32. System.out.println( "N");
  33. } else if(count== 1)
  34. {
  35. System.out.println( "E");
  36. } else if(count== 2)
  37. {
  38. System.out.println( "S");
  39. } else
  40. {
  41. System.out.println( "W");
  42. }
  43. }
  44. }
  45. }

揭晓答案:

问题出在int N=in.nextInt();
            String string=in.nextLine();

这两句上,总是出现数组索引越界异常,问题就是第一句获取的是int,那么下一句再获取的nextLine其实获取的是这一行后面的内容,而不是下一行的内容,那么我们来测试一下:


  
  1. // 本题为考试单行多行输入输出规范示例,无需提交,不计分。
  2. import java.util.*;
  3. public class Main {
  4. public static void main(String[] args) {
  5. Scanner in = new Scanner(System.in);
  6. int a=in.nextInt();
  7. String string=in.nextLine();
  8. System.out.println(string);
  9. }
  10. }

输出

我仅仅输入一个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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场