有關演算法題的奇葩輸入輸出問題的解決辦法

2021-07-16 03:11:57 字數 2029 閱讀 1885

聽說今年網易的筆試題目很難啊,「是啊,傻乎乎坐了兩小時,沒有然後了」

對於經常刷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

}}catch (exception e)

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("") )

}system.out

.println(s_set.size());

兩種方法效果一樣

說到底,經常刷演算法題目的大神是不會掉入這種小坑的。還是怪自己平時對這方面關注不夠咯,慚愧。

其實在和室友討論的時候還出現了第二種方案,機器輸入用例的時間是很快的。所以可以根據時間上的等待時間來判斷是否輸入結束。但是手動模擬是不太好模擬的。等牛客網真題出了要再去試試!

字元輸入,輸出問題

2007 11 23 23 03 yhy19820816 瀏覽 0 次 scanf s c 把字串輸完就退出了,為什麼他們在一起時,單個字元輸不進來?scanf s c 這樣就輸進來了,我不太懂,為什麼他們組合的時候必須加乙個明確的分隔符?scanf d f d c 沒有分隔符,但輸入都是正常的啊....

多次輸入輸出問題

eof初見面,鍵盤快取區,if迴圈的逗號表示式 1 可嘗試用eof來作為迴圈結束標誌,eof在windows中為ctrl c 在 unix中一般是ctrl c,說的簡單一點也就是,只要你不在windows系統中使用ctrl c,迴圈就會一直執行,不會出現 按任意鍵繼續 表示編譯結束 2 並且要麼明確...

輸入輸出問題彙總

8.20嗶哩嗶哩題目遇到的問題 輸入一串字串 中間可能存在空格 怎麼把它儲存到乙個string中。string line getlin cin,line 輸入未知數目的數字,怎麼給存入陣列中?123,23,123,169,123,首先要用字串getline來儲存,把一行資料給存到字串中,然後從字串分...