關於牛客網代碼題 數據讀取問題的 小白指南

作爲一個代碼小白,刷題是一件如攀登珠峯一樣困難的事情
找對登山裝備就不是一件簡單的事情
關於牛客網上代碼題的逐行讀取數據的方式,居然也困擾了我很久
終於在善良同窗的幫助下弄清楚了“套路”
在這裏分享一下,不是給“熟手”看的,只不過是想拯救一下和我一樣小白的“登山者”

以python爲例,其他語言請參考原理自行 觸類旁通

牛客網官方不靠譜指北:

小白要有自知之明,這不適合你,原理更重要

lines = []
while True:
    line = sys.stdin.readline().strip()
    if line == '':
        break
    lines.append(line.split(','))

牛客網幫助:

https://www.nowcoder.com/discuss/276
私人靠譜指南:
原理:

刷題網站的後臺給出的輸入是一個含有多行數據的input文件,直接用sys.stdin.readlines()去逐行讀取數據即可,具體操作如下:

import sys
lines = sys.stdin.readlines()

此時lines中已經包括了所有一行一行的數據,後續操作按需從中取即可,例如:

for line in lines:
    print(line)

如果第一行給出的是樣例數目,需要提前讀取,則可以用readline()代替 readlines() 只讀取一行,而後面再用 readlines() 讀取剩餘行時,python是會自動從第二行開始讀取的:

n = sys.stdin.readline()
lines = sys.stdin.readlines()
*注意:因爲在後臺給出的文件中是會有EOF的,所以readlines()知道什麼時候該停止讀取,但如果在本地調試時,直接在terminal中交互輸入的話,由於沒有EOF,readlines()就會無限地讀取

最好的解決方法是:在本地調試時,也用input文件來給出輸入,也不需要每次調試都輸入一次:

file = open('input.in')
sys.stdin = file
lines = sys.stdin.readlines()

如果一定要倔強地採取交互地輸入的話,可以增加一個判斷,如果某一行輸入的第一個字符就是換行符的話,就認爲數據的輸入結束了,跳出循環:

for line in sys.stdin:    
    if line[0] == '\n':        
        break    
    print(line)

好吧,其實真的很簡單,但是沒弄明白之前就是覺得很混亂
但是萬事開頭難,不能忽視這一步艱辛的開始!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章