算法死活記不???大神告訴你秘訣:內化它的邏輯
?有網友訴說了自己的苦惱——
我曾經非常擅長用不同的語言寫代碼,可是在一年后,我就完全忘記了如何用這些語言寫代碼。
現在我正在嘗試學習 Lua,我能看懂每一行的意思,但是到了要寫出來的時候就不知道該怎么做了。
針對ta的苦惱,網友大神們紛紛給出建議。
你是說循環、變量之類的語法嗎?
還是說排序、搜索、遞歸?這兩種情況,我只有一些基本的想法,剩下的由google完成。我不記得代碼,只記得我需要什么。
?
沒錯,就是這個方法。
知道你需要在這里使用循環比記住循環語法更重要。
一旦你知道你需要使用什么,你就可以根據需要把語法google出來。
顯然有些東西你應該記住語法,比如如何創建一個函數,如何創建不同類型的變量,如何將輸出放到屏幕上......
不過隨著它變得越來越復雜,只要理解這個概念,再google出來就行了。
你是指如何記住怎么寫編程語言的,比如Lua、Python 或 C++ 之類的嗎?
通常,就是通過寫代碼來記住,一段時間不寫,就會忘了,然后你就需要重新去學習它們。
我做的網頁設計/編程越多,我就越喜歡用「直線」方法。
只需選擇你需要學習的下一個東西,并在你們之間畫出最直、最快的線,然后去學習這個東西。弄清楚這一點,然后繼續下一步。你需要學習的只是能讓你完成任務的極少數特定的東西。你不需要成為一個完美的全棧開發人員,事實上,你可以將整個過程分解為大概10到20個核心步驟,假設它不是非常復雜的話。
我確實會閱讀和研究了除此之外的編程語言,因為它們確實有助于在你的工具包中添加更多東西,并且用不同的方法來填充你的記憶,但是當涉及到實際的執行, 直線方法可能會讓你快1000倍。
在條件允許的情況下,就要做減法。如果一個平臺/后端主機很復雜,你需要5個小時才能弄清楚如何做最簡單的事情,而這本應該用幾分鐘就完成,那就退后一步,看看你是否可以以某種方式簡化它。
你是否需要學習3種不同的編程語言并觀看4小時的視頻才能完成實際上非常簡單的任務?或者你能不能找到一些簡單的服務器來存儲你的簡易數據庫——它的使用和集成如此簡單,以至于白癡都能很快找到它?我們并不會因為從A點到B點采取最耗時、最復雜的路線而贏得額外積分。?
我靠的是練習、谷歌和同事:)
我記住得很少,只記得幫助我找到答案的那一點面包屑。如果有好辦法,請指點我一下。
我在面試時最喜歡聽到的答案是——
「值得記住的東西都加了書簽,其他的東西我現在很容易找到;我不需要所有的答案,但我很擅長找到它們?!?/p>
我在很多算法網站上的排名都很高。在我看來,從記憶的角度理解算法是行不通的。你需要內化它的邏輯。想想其他你知道該怎么做的事,你可能可以寫下它的每一步,但你做的時候不會特意去想。比如做黃油吐司。想象一下,你有一個按鈕式烤面包機。你得先烤面包,然后再涂黃油。順序不只是你記住的東西,它是有意義的。如果你先涂上黃油,它就會滴入烤面包機底部的加熱元件中??就滤揪褪且环N算法。是的,你記得這些步驟,但是每個步驟和這項步驟的順序背后都是有原因的。將此應用于您的數據結構和算法。學習簡單算法背后的原理,以構建理解面試問題所需的基礎知識。閃存卡式的記憶術將花費你大量的時間,而且幾乎沒有任何回報。
我知道算法,因為它們是解決問題的廣泛技術。
每當我搞不清特定語言的確切語法時,我都會google,然后閱讀文檔。
Linters 和編譯器錯誤消息通常也很有幫助。?
在過去的十年里,我已經建立了一個我稱之為「個人備忘單」的筆記合集,其中包括我需要反復查找的所有內容。
開始,我用它查找rsync命令、Postgres轉儲/導入命令、nginx配置等,但現在我只有去查那種一兩年才用到一次的晦澀內容時才會用到它。
我想說,我現在已經記住了這些東西的一半了。但是當我學習一種新的語言或概念時,擁有備忘單是關鍵的一步。重新找到你記憶中的SO帖子或博客文章的過程實在是太太太麻煩了。
如果你是指代碼的語法,那么沒有必要記住它。上網查一下就行了,很容易。
如果你指的是實際的算法(一段代碼是一個算法的實現),那就不要把注意力集中在「記住它」上,要試著去分析和理解它,就像它是某種神秘的公式一樣。
我說的「理解」,不是指 「能夠說出每一行的作用」,而是「能夠說出它為什么是這樣,以及它的原理是什么」。
一旦你了解了它是如何運轉的,你甚至不必記住如何去做——因為你將擁有重現它所需的所有推理能力。
如果你在維護別人的代碼時,可能會發現有些代碼非?;逎?,并且涉及很多間接調用和/或副作用。在這種情況下,只需問問自己該代碼的輸入和輸出是什么。只有在你需要重構一個東西時,才需要更深入的研究。
老實說,我記得以前項目的一些部分,但我并沒有太費力,相反,我更關心算法的高級輪廓,比如合并排序:將一個數組拆分為2個數組,然后將這些數組拆分為另外2個數組,直到數組大小降至1,然后按順序合并數組。
或者快速排序:選擇一個樞軸,遍歷數組交換值,如果它們位于樞軸的錯誤一側,則大于或小于樞軸,然后對樞軸的每一側重復執行此操作,直到每個值都是樞軸。
我記得算法的主要部分,如果我在理解上遇到問題,我會將它們放入偽代碼并根據需要修復我對算法的理解。?