做不出OJ上的題,應該怎麼辦?

計算機系學生,剛開始做OJ上的題,就是有些題不會,很長時間做不出來,有的是思路懂,具體實現不會。然後就忍不住從網上搜解法,看一看。。然後就會不自覺地按照別人的來,這樣又覺得不會有太大提高。

希望能夠有前輩指點一下。


首先,不要擔心那麼多,看就是了,你看懂其實也是學習的過程。我OJ前10道題都是自己硬寫的,後來發現1,花的時間太長,刷10道題可以花上十幾天,效率低的嚇人。2,代碼丑,看了高手寫的代碼,會發現自己的代碼寫的太丑了。所以看別人源碼並沒有你想的那麼差,當然,也不是不過腦子的照抄~我的建議是,看到題目,你先自己想一下,寫個偽代碼或思路或總結一些規律出來(多考慮一些邊界情況)~其次,不僅僅只看一個源碼,多看幾個源碼,比較一下優劣,挑最好的學習~最後,在這些源碼中如有不懂的知識,如有一些數據結構不懂,最好看一下書還有API,對其熟悉~最後,寫完源碼後,再reset一遍,自己獨立寫源碼~寫到最後,你會發現recursion的題目解法結構大多差不多~DP解法也是靠經驗積累和總結,當然有些奇才就能想得到,就不說了~還有些題你寫的很複雜,卻用XOR就能解決的巧妙,不要覺得這是偏門左道,bit manipulation也是非常重要的考察範圍,用這種方法可以節省不少時間~


OJ上的題目,難度參差不齊,如果是初學者,我建議用 hackerrank. Programming Problems and Competitions :: HackerRank 有練習,有比賽,問題的解釋也很清晰,簡單比較一下兩者。

1. 題目的說明

Hackerrank上說明很清晰,有解題指導,輸入輸出的說明和限制條件,而OJ上的說明太簡單,比如沒有限制條件,考慮的時候,往往忘了考慮一些極端情況。

2.編輯器

Hackerrank支持vim和Emacs模式,語法高亮和更好

3.Discussion

hackerrank上每一個題目都有一個討論區,討論的功能沒有特別好說的,推薦Hackerank的一個理由是這討論區裡面會有hackerrank的專職員工在上面給你回答問題,會提供解題方法和思路,引導你去解決問題,而不是告訴你答案,當然我也看到有給找bug的。

4.Leaderboard 和 Code Pair

這個OJ上好像沒有,排名其實不是重點,重點是當你答題成功之後,你可以下載查看上面每一個人的代碼,有一個Code Pair用於比較,從中你可以學到不同人解決問題的方法和思路以及代碼風格。Code Pair做的非常棒,不僅可以看代碼,還能測試輸入輸出,你甚至可以和作者交流,文字和視頻。

5. 運行結果

Hackerrank上每一個問題都有非常多的測試用例,只有全部通過之後才能得滿分,而且每一個用例除了結果正確之外,也會有時間限制,最最重要的是,每一個測試用例的輸入和輸出你都可以下載到本地,可以在本地編寫完整的代碼並Debug。Debug是一個非常重要的過程。OJ只需要你實現核心代碼,測試用例不能下載,只有運行結果,這很大程度上增加了解決問題的難度。

6.問題的設置

Hackerrank上的問題設置從easy到expert,每個題目都有難度的標識,並且對問題做了分類。再一個,有些問題的設置是有連貫性的,比如 Insertion sort - 1 到 Insertion sort -3 再到 analysis。從 insertion sort-1 告訴你insertion sort是怎麼一回事,再到 insertion sort -3 一點點的實現插入排序,再到應用,最後到 analysis的階段就會讓你寫程序比較插入排序和其他排序的時間複雜度等等,這樣從學習到理解應用都能連貫起來。

到點吃飯了,做個小結, OJ適合挑戰,不過由於輸入輸出debug我們都不能本地進行,難度無端的增大了,容易打擊學習的熱情。 Hackerrank在各方面都做得很優秀,強力推薦,每天在hackerank上解決一個問題,從難度easy做到expert,循序漸進日積月累,水平會有很大提升。


上知乎圈v大。


先(虛擬)整容(美圖秀秀),後po圖,再圈知乎大v,就有一群碼農不請自來了


直接按照題意模擬的題目做得出做不出全靠理解能力和編碼能力;

而需要用特定甚至多種已知演算法、應用高級數據結構的還需要會選擇並且實現某種演算法或者數據結構,這就要靠經驗了,看題解的時候關注選擇的理由,演算法怎麼應用在題目的模型上的。

然後下次碰到可以用類似演算法解決的題目也許就可以想到了吧。還是不能的話接著練啊。

本來習慣性地編輯完題目規範用詞之後我該點X的,因為沒什麼好問的。看到這麼多開玩笑的,不講為什麼的答案,我還是回答了,真是...

以上編輯於 2016-04-17

其實貪心模擬動規題的學習曲線還是蠻類似的,都需要一些抽象能力,這部分忘了說

我講的其實不夠。還有計算幾何數論等領域,都需要一些認真的學習..


面對面問,不要看他們的代碼,找不到活人回答你就先放著。

================================================

作品:《天地傳》

其實我覺得OJ做不出來完全沒必要擔心,實在不行就不做了。我在做出上面這個RPG的時候,只會冒泡排序和鏈表


和其他很多答主的看法不一樣,遂想答一下這題。

我覺得題主的問題其實是:沒有看過演算法書,甚至沒有系統性地學過一點數據結構,也沒按合適的順序刷,剛上來就直接上OJ刷題。

這樣刷題就像無頭蒼蠅一樣亂撞題,這樣開刷題的話,既不容易做出,又容易養成一做題就去找題解的壞習慣,還很容易被打擊信心導致放棄。

我的建議是初學者應該先抱著劉汝佳的粉皮書看完前七章後(最少也先看到第五章)再開始刷OJ。


正在努力刷leetcode的渣渣說點經驗。

刷題之前的演算法水平:較為了解常用的數據結構及演算法,不過沒看過演算法導論。

現在刷題的感受:鏈表,樹,數組一類的題目沒啥壓力,基本很快可以有思路,一到半小時以內差不多ac(所以渣渣),但是一些細節題,比如判斷合法數字,往往需要非常久的時間。

總結:首先數據結構和常用演算法你肯定要了解,演算法指的是樹和圖的遍歷、排序、二分查找之類的。然後就是多寫了,沒有捷徑,有時候你想不到這裡可以用二分或者快排的思想,就是寫的少,對演算法理解不夠深入,所以一起加油吧少年!我今天還有一道題要刷,我繼續了!


瀉藥

一個oj題 扣腚扣不出來很正常的,可以留著慢慢扣,說不腚那天讓你扣出來了,就不幹燥了,太舒服了……

這個東西就是不斷通過解題過程,deep think來鍛煉編程思維,積累解題技巧。

這個很需要 靈活的思維和理解能力,處理細節的能力……很難的演算法,變態的題目,沒下限的測試數據,一般人很快就能知道自己的智商上限

想出來演算法是第一階段

代碼實現出來跑過sample數據是第二個階段

………

提交通過測試就是第二十個階段

渣校帶過人的acmer,這個東西主要是選人,然後一批一批的淘汰……,有這種天賦的人自然為之著迷……

練此功不能強求,本來就是精妙的思維遊戲

見過有些人oj上做不了多少題目仍然擔當主力,也見過在oj上刷了800多道真組團幹起來不頂用,省一等都他TM費勁的。會吹牛逼跟能玩這個完全沒關係,這個玩不好你可以去考研嘛

數學能力要紮實,如果不喜歡摳題,那就算了……

本來就個是精妙的思維遊戲


演算法課的老師說過一句話,解決問題的關鍵在於問對問題

想想要解決問題A,你要先解決的子問題或者達到的先決條件是什麼,比如漢諾塔要移動最底下的環我就要先移開上面的n-1個環

另外那些按照別人方法來的題目,不要寫完代碼就算了,模擬一下他的思考過程,過個把星期重新做

說是這麼說我刷oj還是菜如狗…


沒思路的題Google

有思路的先動手實現,再和別人的代碼比較差距在哪裡


OJ啊。

一分類:做不出來的題可以找攻略將問題歸類。先別看具體題解,知道大概是什麼類型的問題,是圖論,數論,還是動態規劃,或者是沒啥演算法直接順著做就好的東西。

二看書:找本書來看吧,是演算法導論呢,還是覺得就應付下acm,看看寫給中學生的競賽指導都行。反正如果是為了ACM就比中學生比賽的要求低很多了,如果是為了面試求職的演算法,又比ACM的要求低很多了。桉書上的順序看,看完了以後再把分類出來對應的題目跟書上附帶的習題都過一遍。敲敲代碼,OJ過掉,詳細題解看一遍,跟自己的進行比較,如果還有問題的話,就再問人吧。

以上兩個步驟過完,你應該還有部分題目沒在競賽書上找到對應的分類,那麼一部分應該是數學題,一部分應該是智力題。這個就完全看個人提高了,也不用強求。


剛開始的話,基礎很重要,多看幾本演算法書以及離散數學等,再做些水題提高些自信。

你可以試試http://www.51nod.com,裡面題目分了級別的,從低級到高級刷,刷到 @曹鵬那麼牛逼,就可以稱霸一方了。


做不出來的時候,請別人指點下,參考網上的代碼也可以。問題是,做oj不是僅僅為了那一個accepted,雖然一直做不對心裡會很憋屈。。。更重要的是,要學會吸收別人好的東西,以及總結自己的不足。有時候,就算你費了九牛二虎之力,用很複雜麻煩的方法做出來了,實際意義也不是很大。我不是反對獨立思考,而是從更長遠的角度來說,一個新手需要的是成長與進步,而不僅僅是證明自己。oj都是偏演算法和技巧的,關鍵是思路清晰。有時候腦子很清楚,知道自己每敲一步代碼是在幹什麼,一鼓作氣地敲完。沒有bug,這樣通過率幾乎是百分百。就算不過,那就是方法的問題或者優化不到位。其實不是很好的是,莫名其妙地迷糊地過了。。。

多看看寫的好的代碼,利用每一次不通過的機會訓練debug能力。。。差不多這樣了。

by 一個大學做了兩年oj還很菜的人。


先看下討論版里找一下思路。還實現不出來就搜題解看思路。還是不會就抄代碼。然後找相似的題目自己寫代碼。如果時間充足的話…

同時,刷題的時候離一頭漿糊的小夥伴遠一點


表示,OJ上面的題目,我們需要按照自己的水平來做的,不知到國內的OJ怎麼都不引入天梯系統;

像你這樣的,可以找個國外的有天梯功能的OJ,來試一下,例如:codewar (http://www.codewars.org)和國內的dadio(www.dadio.xyz);


…前期不會的話抄代碼就抄啊,有什麼關係,學習什麼不是從模仿開始的,抄著抄著就有自己的想法了。


答案黨表示會把自己能想到的方法全都試一下,如果2天之內AC不了的話會去看討論里別人的代碼。。。


先寫了本地跑點數據測測看。

跑本地數據總能通過吧!!!通過不了就debug。

跑完本地數據再上傳OJ,

如果發現答案錯誤或runtime error,就改邊界值等。

不管是否超出時常,最後看看別人的答案,改進自己的演算法。

如果做不出來,也看看別人的答案再自己寫。

這樣一開始花的時間比較久,到後來會慢慢變快。


喳喳目前在用hankerrank,感覺很不錯,比賽也很多,leetcoder也在做,這兩個網站都是非常不錯的,強烈推薦


推薦閱讀:

為什麼有的軟體公司堅持使用自己的窗口樣式,比如 Adobe 的 CS 系列?
有哪些類似有道雲筆記的筆記軟體值得推薦?

TAG:軟體 | 計算機 | 編程學習 | 編程入門 |