我正在準備2017年Google HashCode世界錦標賽決賽。這是Google組織的最大規模的演算法問題競賽。
我從九年級開始從頭開始學習 C++。 我對程式設計、演算法或資料結構一無所知。 在某個時候,我寫了第一行程式碼。 七個月後,程式設計競賽迫在眉睫。 我想看看我的程式設計學習方式效果如何。 這是一個絕佳的機會。
經過兩天的比賽,結果出來了:我拿了金牌。
我很震驚。 我以 5 年的經驗領先競爭對手。 我知道我很努力,但這個成績超出了我的預期。 我意識到體育節目是我的主題,並一頭栽進去。
本文的翻譯得到了 EDISON Software 的支持,關心程式設計師的健康和早餐 和開發客製化軟體 .
選擇哪種程式語言
- C++ - 強烈推薦! 他速度非常快。 由於 STL,演算法的實作只需要很少的時間。 所有比賽均接受 C++。 我用 C++ 編寫了第一行程式碼。
- C - 透過 STL 學習 C++。 如果您了解 C,您也可以使用 C++ 進行程式設計。
- Java 是一種運作緩慢的程式語言。 它有一個 Big Integer 類,但對你沒有多大幫助。 如果比賽有時間限制,使用 Java 你一定會超過它。 並非所有比賽都接受 Java。
哪裡可以練習
我建議
首先,你需要磨練基礎知識
一旦您習慣了該語言的語法,就需要克服一些問題。 從需要練習的簡單問題開始。 在這個階段,最主要的是確定你的程式風格。 也許您喜歡編寫帶有大量空格的程式碼,也許您不喜歡。 您可以將括號與“if”放在同一行,也可以將它們放在不同的行。
你必須找到你的程式風格,因為這是你的風格。
當您尋找它時,請記住兩個基本原則:
- 您的程式碼應該易於實現。 您應該能夠輕鬆地實施您提出的解決方案。 為什麼? 因為在比賽期間,您最不想看到的就是迷失在程式碼中。 多花 5 分鐘思考如何簡化程式碼的實作總是比花 10 分鐘試圖弄清楚要好。
- 您的程式碼應該易於閱讀。 當程式碼易於閱讀時,調試也很容易。 讓我們面對現實吧——錯誤總是會發生。 你知道當你還剩 10 分鐘卻找不到該死的錯誤時的感覺嗎? 當然可以。 為了避免這種情況,請編寫清晰的程式碼。 一旦開始調試,程式碼就會顯得自然且易於理解。
如何提升您的開發技能
練習,練習,再練習。 我建議您解決前 250 個最容易解決的問題
不要說:“這個問題對我來說太難了,我會盡力解決下一個問題。” 這就是失敗者的想法。
拿一張紙和一支鉛筆。 想一想。 也許你能找到解決方法,也許不能。 至少,您將培養演算法思維。 如果您無法在一小時內找到解決方案,請在論壇或文章中尋找現成的解決方案。
透過這種方法你會取得什麼成果? 學習使用程式碼快速實現您的想法。 並研究經典問題和演算法。
其次,你必須掌握演算法和資料結構
遵循分層方法。 您是否在不知道如何走路的情況下開始跑步? 不。 沒有堅固的地基,你能建造一座摩天大樓嗎? 不會再有。
您不能忽視學習路徑上的步驟。 如果你忽視它們,你就會留下知識空白。 隨著時間的推移,它們只會變得更糟。
從基本演算法和資料結構開始
很難開始。 也許是因為你不知道先學什麼。 這就是為什麼
如果你致力於解決簡單的問題,你永遠不會進步。
了解未知事物最有效的方法就是在實踐中體驗它。 我就是這樣學習的。 透過選擇一項具有挑戰性的任務,我學到了許多以前從未聽說過的新技術。
你每解決三個問題就應該教你一些新東西。 選擇問題時要更加小心。 選擇更難的問題!
一旦您完成了 SPOJ 的這 250 個問題,您將對體育編程的核心主題有基本的了解。 深入理解基本演算法背後的邏輯,高階演算法就會顯得不那麼複雜。 這樣你就可以充分利用你的知識。
深入挖掘每個主題
如果你在學習新事物後不加強知識,你很快就會忘記一切。
我建議你學習一種新演算法後,在實踐中使用它。 完成 2-3 個任務。 在 SPOJ 中尋找演算法標籤。 在那裡你會發現需要這個演算法來解決的問題。 首先解決這些問題。
了解動態規劃,因為它會帶您走向勝利
根據我的經驗,每場比賽都至少有一個問題
這很好。 因為如果你了解動態規劃,那麼你就會贏。
我喜歡動態規劃,這是我最喜歡的主題。 動態規劃的秘訣是做出全域最優選擇,而不僅僅是局部最優選擇。 您必須將問題分解為更簡單的子問題。 每個子問題僅解決一次。 然後建立一個結合已解決的子問題的解決方案。
在學習新概念的同時,請查看
努力工作
你聽過沒有經過多年訓練就能贏得奧運冠軍的運動員嗎? 我沒有。
每年,電腦奧林匹克競賽的準備工作從九月開始,到四月結束。
這8個月我每天練習5小時。
是的,我花了這 5 個小時只解決演算法問題。 我記得那些日子我練習了8小時甚至10小時。 為什麼? 因為我喜歡它。 每天放學回家,我都會直奔臥室,坐在電腦前,開始分析新問題。 或者我正在學習一種新的演算法,我需要知道它來解決這個問題。
如果你想贏,你也必須這麼做。 選擇一個問題並堅持下去。 在步行去超市或開車時想一想。
您是否知道,當您睡覺時,您的大腦會對當天收集的資訊進行碎片整理? 他似乎正在按字母順序將書籍堆放在書架上。 本質上,你的大腦會思考你面臨的各種問題。
這個可以熟練運用。 睡覺前,閱讀一道難題並記住如何解決它。 在此階段,您不需要尋找解決方案本身。 睡覺。 你的大腦將開始處理這個問題。 當你醒來時,你會驚訝地發現你在睡夢中找到了解決方案。
自己嘗試一下。 這就像魔法一樣。
我創建了一個視頻博客
這段短文與體育節目無關。 如果你二十多歲,想知道我如何看待這個世界,你可能會想看看
聰明地工作
這就是成功的秘訣。 你需要目標。
我們是人,我們喜歡它
如何戰勝拖延症
給自己設定目標。 你總是會發現有趣的問題,從中你可以學到新的東西(看看我上面提到的資源)。 但這些問題需要解決,而不僅僅是閱讀。
這就是我克服拖延症的方法。 我開始製作紙本日曆,每天都寫滿我想解決的問題。 我總是提前兩天填寫問題。 所以我知道如何管理接下來幾天的時間。
所以我總是充滿動力。 我需要解決一些問題並找到新的問題來填補日曆上接下來的日子。 劃掉已解決的問題感覺很棒。 我知道你也喜歡它。
取得您自己的紙本日曆。 不要在手機上建立另一個您明天就會忘記的待辦事項清單。
如何有效調試
你想成為專業人士嗎? 如果是的話,那麼你需要「在心裡調試一下」。
這是迄今為止我所知道的最有效的調試技術,因為它根本不需要調試器。 與其他程式碼相比,您的大腦會同時檢查多個程式碼分支,並為您提供更廣泛的程式碼概覽
你可以把自己比喻成下棋的大師,他會提前思考 3 步。
我僅使用此技術作為我的初始防線。 然後我使用真正的調試器。
要學習如何在頭腦中進行調試,您需要練習。 當您驗證問題的解決方案並獲得“錯誤答案”時,請勿直接轉到偵錯器按鈕。 重新閱讀程式碼並思考:“這一行發生了什麼?”、“這裡的“if”對程式有何影響?”、“當我們退出循環時,迭代器的值是多少?”
這樣你就可以自己思考了。 隨著時間的推移,您將學習編寫程式碼並即時偵錯。
關於作者
Andrei Margeloiu 是一位狂熱的程式設計師,對創業、新創公司和戶外活動感興趣。 你可以聯絡他
翻譯:戴安娜·謝列米耶娃
來源: www.habr.com