JS刷題總結
作者:汕大小吳
鏈接:https://www.nowcoder.com/discuss/72658?toCommentId=1265135
來源:牛客網
多總結,才能更好地進步,分享下最近的刷題總結給大家,希望對於大家的學習和求職有所幫助。
關於縮減代碼
1.善用js中的函數或者特性
(迭代、解構、set等等)
2.善用位運算
(相信我,能用位運算的就用位運算)
3.善用正則表達式
(只要關於字元串的題目都應該聯想到用正則表達式)
要會寫正則,可以用正則表達式的幾個函數也要掌握
正則中:exec,test
字元串中:search,match,replace,split
具體例子可以看我的:百詞斬題解第一題經驗
4.少寫函數
刷題不是寫業務代碼,沒有說要封裝重用,AC才是王道。
並且寫函數還要思考需要哪些參數,參數如何傳遞,會影響思考速度。
我們盡量做到的是,思考清楚後直接敲,越快越好,而不是一遍敲一邊思考。
5.遞歸函數
前面情況有例外,比如要寫遞歸,就要寫函數。遞歸函數可以減少代碼。
不過還是建議用遞歸思想去想,用循環搭配數據結構(棧/隊列)去解答
關於刷題方法
1.審題先判斷陷阱
看到題目第一先看是否有時間複雜度、空間複雜度的要求。(比如大數問題、遞歸多了棧溢出等問題)
根據自己猜測判斷使用簡單方法,還是複雜方法來做,畢竟我們沒有時間去做兩遍題目。
然後再順便看下是否需要判斷邊界條件(一般都需要出錯判斷)
有時間複雜度要求的,可以優化排序、動態規劃、以空間換時間等
有空間複雜度要求的,可以用循環代替遞歸、動態規劃代替遞歸等
這裡講下為什麼不說貪心,第一理論上所有貪心可以解決的問題都可以用動態規劃來做,第二正因如此,許多公司難題也就只考到了動態規劃。
所以請一定一定要掌握動態規劃。
2.聯想
我們遇到題目時要把題目和以前做過的題聯想下,通過類似點,找出突破點。
- 字元串問題====》正則
- 鏈表、數組問題====》雙指針
- 數組問題====》利用數組下標來做====》有時需要額外數組
- 多維數組問題====》降維來做。
- 複雜問題、優化問題====》動態規劃
- 排列問題====》遞歸、回溯
- 數論問題====》找規律、動態規劃
- 樹的問題====》遞歸、深度遍歷、廣度遍歷====》棧、隊列
- 次數問題====》哈希表存儲(js中建議使用{},而不要使用ES6中的Map)
- 大小值問題====》棧、隊列、哈希表做存儲
- 從前往後、從大到小比較複雜====》從後往前、從小到大思考。
- 動態規劃重點了解
- 位運算也了解一下
3.必須掌握的演算法
快排和歸併排序、深度和廣度遍歷、二分查找、(能手撕)
動態規劃、回溯法。
你可以根據題目分類著重去刷這些演算法。
4.多畫圖
對於涉及數據結構的題目,如鏈表、二叉樹等一定要畫圖。
對於涉及概率的問題,可以畫圈圈來交、並、補。
對於點線的問題,可以畫坐標系。
5.多舉例
對於複雜問題可以舉不複雜的小例子來分析步驟。
對於數論問題可以舉例子來找規律。
退一萬步來說,假設你實在不會做,你也可以通過舉例,自己if-else生產很多測試用例去滿足題意。
曾經一個print()就AC50%了,再來一個也許就100%了。
6.剩下的能淘汰你的只有智力題了。
(逃)
有些忘記了,暫時想到的先寫這麼多了,慢慢補充,有什麼好的建議或者技巧都可以發給我,虛心接受。
更多筆經面經:https://www.nowcoder.com/discuss?type=2&order=0
推薦閱讀:
※Portfolio Critique #8 - Facebook by Sunny
※一周內搞定你的新工作:如何做到高達90%的面試成功率?
※求職者如何避免倉促跳槽?
※想在年後的求職中更有競爭力,這個寒假應該該準備些什麼?
※你是如何發現自己的喜好的?