1. 程式人生 > >昨日參加hackerrank一比賽總結

昨日參加hackerrank一比賽總結

昨天第一次參加hackerrank的某比賽,從中午11點做到了晚上12點,最後太累,在比賽結束前一小時睡覺去了。完全通過了前兩道題,第三題對於某句話始終未能正確理解,所以未通過該題大部分test case,最後在該比賽排名在23**/60**。自己是抱著學習的心態去的,雖然這個成績沒什麼可炫耀的,但是還是要總結一下。

  • 發現自己需要提高
    最好的前五名做題快且對,確實高手如雲。第一名好像所有題目都做對了,時間只花了5個小時。
    看到了自己需要提高的地方

  • 基本資料結構有待提高
    因為喜歡用Java,不過對於有的資料結構還不太熟練,所以花了一些時間瞭解有關類的用法,
    比如最喜歡用的hashmap,關於HashMap是這樣的,定義

HashMap<String,int>

會報錯,而改為

HashMap<String,Integer>

就OK了。
對於輸入時就需要生成排序列表,然後按順序挨個訪問的情況,採用了PriorityQueue,個人覺得這個類還是很好用的。

  • JUNIT是必須的
    因為每道題目的輸入都是從STDIN灌入的,對於簡單題目可以手動一次一次敲,但是對於複雜的題目,一次一次手敲會累死,且慢且容易出錯
    後來在比賽結束前幾個小時,受夠了手動輸入測試用例,
    然後調整了程式架構,開始使用JUNIT測試,
    但是最新的JUNIT4跟JUNIT3比有很大的調整,改為了測試用例方法前加@test標記,
    而且由於機器上環境有限,所以需要用命令列執行JUNIT4,
    所以又摸索了一些時間。用了JUNIT以後,感覺心裡更有底了。

  • 把握時間
    早上是我的黃金時間,但是我扯了一個多小時電話,這個是失策,

  • 儘量用高效演算法
    昨天有道題,某輸入變數最高值可達100000,然後看到討論組有些人因為超時而未通過某些測試用例,估計他們採用了迴圈套迴圈又套迴圈這種層層巢狀的方法。
    因此,可能對於最高輸入值超過50的,都儘量避免蠻力搜尋。

  • 準確理解題意
    昨天,第三道題內的有一句話,出題的人沒有給出詳細的解釋,到最後才發現,自己其實完全不理解這句話,但是我已經沒時間去討論組詢問了。
    所以,對於這種題目,可能首先我不該做,
    其次,如果非得做,我應該去討論組提出我的疑問,儘量用一個具體例子,讓出題的人來答疑

  • 邊界值
    昨天有道題,不小心邊界條件漏掉一個值,導致一半的測試用例未通過。最後我修正了,就全部通過了。
    這個事情要預防,就是程式設計的時候,自己控制邊界值,然後模擬這種情況。
    有時候,邊界值太大,導致無法人工建立正確的測試用例,那麼這時候可能需要創造條件,比如,昨天有個邊界值可達100000,如果自己沒條件在這種條件下人工弄出一個正確的測試用例,可以把它改成5,這樣可以人工弄出一個對應的正確的測試用例,然後測試一下這個邊界。

  • 選題原則
    做自己能透徹理解的題目,理解不了可能不該做。
    如果非得做,就應該去討論組詢問,弄懂意思,再做。
    有的題目如果實在搞不懂,應該放棄,選做別的
    而且根據自己的情況,看一下平均提交正確率,選適合自己水平的題目。

  • 加強對演算法、資料結構、數學的學習
    起碼不會把時間浪費在熟悉基礎資料結構、修改語法錯誤、熟悉經典演算法等等問題
    加強數學修養,把握問題本質
    這樣比賽的時候,就能把精力放到問題的本身,而不是其他細枝末節上。

  • 絕不可以抄襲
    不可以向任何人公佈自己的程式碼,被抄襲者和抄襲者都會被取消資格,這是不值得的。

  • 儘量幫助別人
    昨天在水深火熱解題中,突然看到有人在8小時前發來訊息,諮詢某題目思路。雖然自己覺得太菜,不可能有人會來求助,但是這事還是發生了。所以非常簡單地介紹了一下總體思路。
    幫助別人可以,但是規則不允許直接把演算法和程式碼直接告訴別人。所以還要把握度的問題。

  • 題目是用英語出的
    所以這也是練習英語的好機會。

總而言之,很感激有Hackerrank這個公平競爭的平臺,希望可以不斷進步!