多總結,才能更好地進步,分享下最近的刷題總結給你們吧
關於縮減代碼 1.善用js中的函數或者特性。
(迭代、解構、set等等)php
//使用箭頭函數縮減代碼 //處理輸入,能夠用.map,須要注意其全部參數 //此外其餘迭代方法也須要掌握。 let line=readline().split(" "); line=line.map(e=>parseInt(e)); //去重 arr=[...new Set(arr)]; //升序,排序能夠用sort,默認是字典序,而且能夠根據須要定製,須要深刻掌握 arr.sort((a,b)=>a-b); //迭代輸出 arr.forEach(i=>console.log(i)); //求最大值,使用擴展運算符... max=Math.max.call(...arr); // 複製數組 arr2=[...arr1]; arr2=arr.concat(); arr2=arr.slice(); //善用解構 //變量賦值 let [a,b,c,d,e]=[1,2,3,4,5];//a=1,b=2,c=3,d=4,e=5 //交換變量值 [a,b]=[b,a]; //題外話:字符串中的字符是沒法交換的 let str="ab"; [str[0],str[1]]=[str[1],str[0]];//無效,"ab" //不過能夠將字符串拆成字符數組後就能夠交換了 str=str.split("");//["a","b"] [str[0],str[1]]=[str[1],str[0]];//["b","a"]
2.善用位運算。
(相信我,能用位運算的就用位運算)正則表達式
//求數組一半長度 halfLen=a.length>>1; // 不過須要注意右移運算符>>優先級別加號+還低,例如 console.log(3+((5-3)>>1));//2 console.log(3+~~((5-3)/2));//4 //所以在於其餘操做符號想結合時候能夠適當增長括號,例如求中位 mid = left + ((right - left)>>1); mid = left + ~~((right - left)/2); //不建議使用mid = (left + right)>>1;,由於加號操做可能形成溢出 //~~等價於Math.floor(),|0也等價於Math.floor() halfLen=~~(a.length/2); halfLen=(a.length/2)|0; // 判斷奇偶 evenNum&1==0;//偶數 oddNum&1==1;//奇數 //善用異或 5^5=0 5^5^6^6^7=7 //判斷數是不是2的冪次方 num & num-1 == 0; //翻轉數的第K位 num ^= (1 << k); //將第K位設爲0 num &= ~(1 << k); //將第K位設爲1 num |= (1 << K); //判斷第K位是否爲0 num & (1 << k) == 0;
3.善用正則表達式。
(只要關於字符串的題目都應該聯想到用正則表達式)
要會寫正則,能夠用正則表達式的幾個函數也要掌握
正則中:exec,test
字符串中:search,match,replace,split
具體例子能夠看個人:百詞斬春招筆試題解
4.少寫函數。
刷題不是寫業務代碼,沒有說要封裝重用,AC纔是王道。
而且寫函數還要思考須要哪些參數,參數如何傳遞,會影響思考速度。
咱們儘可能作到的是,思考清楚後直接敲,越快越好,而不是一遍敲一邊思考。
5.遞歸函數。
前面狀況有例外,好比要寫遞歸,就要寫函數。遞歸函數能夠減小代碼。
不過仍是建議用遞歸思想去想,用循環搭配數據結構(棧/隊列)去解答
關於刷題方法 1.審題先判斷陷阱。
看到題目第一先看是否有時間複雜度、空間複雜度的要求。(好比大數問題、遞歸多了棧溢出等問題)
根據本身猜想判斷使用簡單方法,仍是複雜方法來作,畢竟咱們沒有時間去作兩遍題目。
而後再順便看下是否須要判斷邊界條件(通常都須要出錯判斷)
有時間複雜度要求的,能夠優化排序、動態規劃、以空間換時間等
有空間複雜度要求的,能夠用循環代替遞歸、動態規劃代替遞歸等
這裏講下爲何不說貪心,第一理論上全部貪心能夠解決的問題均可以用動態規劃來作,第二正因如此,許多公司難題也就只考到了動態規劃。
因此請必定必定要掌握動態規劃。
2.聯想。
咱們遇到題目時要把題目和之前作過的題聯想下,經過相似點,找出突破點。
字符串問題====》正則
鏈表、數組問題====》雙指針
數組問題====》利用數組下標來作====》有時須要額外數組==》此外大部分要考慮二分法優化時間複雜度
多維數組問題====》降維來作。
複雜問題、優化問題====》動態規劃
排列問題====》遞歸、回溯
數論問題====》找規律、動態規劃
樹的問題====》遞歸、深度遍歷、廣度遍歷====》棧、隊列
次數問題====》哈希表存儲(js中建議使用{},而不要使用ES6中的Map)
大小值問題====》棧、隊列、哈希表作存儲
從前日後、從大到小比較複雜====》從後往前、從小到大思考。
動態規劃重點了解
位運算也瞭解一下
3.必須掌握算法
快排和歸併排序、深度和廣度遍歷、二分查找(能手撕)
動態規劃、回溯法。
要專門根據題目分類去刷這些算法。
4.多畫圖。
對於涉及數據結構的題目,如鏈表、二叉樹等必定要畫圖。
對於涉及機率的問題,能夠畫圈圈來交、並、補。
對於點線的問題,能夠畫座標系。
5.多舉例
對於複雜問題能夠舉不復雜的小例子來分析步驟。
對於數論問題能夠舉例子來找規律。
退一萬步來講,假設你實在不會作,你也能夠經過舉例,本身if-else生產不少測試用例去知足題意。
這也是爲何咱們刷題時,題目不會像劍指offer題目同樣,告訴你的答案和題目的測試用例有哪些不一樣的緣由。
6.剩下的能淘汰你的只有智力題了。
有些忘記了,暫時想到的先寫這麼多了,慢慢補充,有好的建議均可以發給我
轉載於猿2048:➬《JS刷題總結》算法