被技術筆試在線編程題輸入輸出坑了的我,警醒大家注意這些!!!!!!(被百度,網易,騰訊筆試輸入輸出坑了的我提醒大家注意這些)
你是否還在爲在線編程題輸入輸出而煩惱?
你是否還在爲本地編譯器通過而在線編程題總是無法通過而煩惱?
你是否還在爲明明刷了很多算法題筆試成績還是不理想而煩惱?
來這裏就對啦!!!!!!!!!
我真的是被坑了若干次,感覺失去了好多機會啊,嗚嗚嗚嗚!!!!!
本人小白,目前已經刷了劍指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書籍資源。
掃描下方二維碼,或者搜索公衆號你還有頭髮嗎