你和名企的距離,差的不僅是985/211或研究生學歷

今天高考結束了, 或許有些熱愛代碼的00後同窗,看到網上公佈的答案,開始估分,自已離985/211就差作錯或少作一道題, 感受沒戲,來社區看代碼來了。我在不少年前,考上的也是雙非學校。雖然有一點怪本身懵懂暗戀上的女同桌在一個考場先後桌,在考場上發揮不佳,可是,每門功課,對偏難的題目,從不躍雷池一步,心裏有些雙非能力的設定, 不無關係。javascript

即然已經工做寫代碼了, 仍是寫了多年前端的老司機,想給雙非學校並在準備秋招的前端同窗說一句,算法真的很重要,就像高考時,數學的最後一兩道題,答對了,能進985/211,答不對,就是雙非學校。而在秋招中, 算法題答很差,很難進名企。html

leetcode正流行

且不說,宇宙條,前端面試考的是一堆算法題,騰訊/阿里,二面或三面有專門的算法在線筆試題。上半年,github最火的開源項目裏,好幾個leetcode相關的項目。隨着leetcode愈來愈流行,留給前端實習同窗過一遍排序算法,就能拿還不差公司offer的好日子怕是沒有了。前端

  • leetcode題解 來自兌吧的lucifer, 以前也看他寫的從零開始寫一個webpack200行代碼實現 mini-React 等前端面試中等別有用的技術解析。做者以本身解leetcode 的思路和麪試的考查點,解構了leetcode題庫,很是推薦。
  • leetcode animation 來自程序員吳師兄, 3萬+ start的神開源項目,正是它讓對leetcode 的理解動畫起來,而且帶起來了leetcode學習風,不可錯過。有了它,不會算法,是藉口。
  • 極客時間王爭老師的數據結構與算法之美

要去名企,先去leetcode官網解題

面試及在線寫代碼,用牛客網, 我建議要高效學習,使用上各類學習神器及在線學習產品。由於大廠面試時, 爲了提升效率, 直接或間接地採用了這些在線測試產品,同時,最重要的是,它讓咱們對於算法的學習,被記錄下來, leetcode學習能夠被證實。java

有新意的leetcode學習方式分享

我想在這裏, 給你們分享一份比較適合前端, 可視化, es6, 簡單易上手的解題策略。node

leetcode 86題鏈表分隔

鏈表分隔, 是一道數據結構鏈表的基礎考查題,題目以下:webpack

給定一個鏈表和一個特定值 x,對鏈表進行分隔,使得全部小於 x 的節點都在大於或等於 x 的節點以前。你應當保留兩個分區中每一個節點的初始相對位置。git

輸入: head = 1->4->3->2->5->2, x = 3
輸出: 1->2->2->4->3->5
複製代碼
  • leetcode Animation 看圖解, 事實上, 大多數時候,我是跟着吳師兄,來解leetcode的題的。總能隨着他的算法動畫,get到算法的解題意圖。 程序員

  • 來自trekhlebes6

trekhleb的數據結構實現,很是nice, 強力推薦,我在刷leetcode 數據結構類題目時,使用trekhleb的代碼來實現github

結點代碼

export default class LinkedListNode {
 constructor(value, next = null) {
   this.value = value;
   this.next = next;
 }

 toString(callback) {
   return callback ? callback(this.value) : `${this.value}`;
 }
}
複製代碼

鏈表實現代碼

import  LinkedListNode from './LinkedListNode.js';

class LinkedList {
 constructor() {
   // 1->4->3->2->5->2 
   this.head = null;
   this.tail = null;
 }
 append(value) {
   const newNode = new LinkedListNode(value);
   if (!this.head) { //空鏈表 
     this.head = newNode;
     this.tail = newNode;
   } else {
     this.tail.next = newNode;
     this.tail = newNode;
   }
   return this;
 }
 toArray () {
   const nodes = [];
   let currentNode = this.head;
   while(currentNode) {
     nodes.push(currentNode);
     currentNode = currentNode.next;
   }
   return nodes;
 }
 toString() {
   return this.toArray().map(node=>node.val);
 }
}

export default LinkedList;
複製代碼

鏈表 由結點構成, 每一個結點包含數據和指針,我在寫這道題時, 在鏈表裏僅實現了append 加子結點, toString 查看鏈表等方法。

  • 在代碼中, 作用了es6的模塊化, 我使用了webpack 來編譯代碼, 讓他跑起來, 並使用webpack-dev-server讓他在瀏覽器中可視化整個學習的過程。個人webpack.config.js 的配置以下:
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  plugins: [
    new HtmlWebpackPlugin({
      filename: 'index.html', // 配置輸出文件名和路徑
      template: 'src/index.html', // 配置文件模板
    }),
  ],
  devServer: {
    port: '1314'
  },
}
複製代碼
  • 參照paopao2的代碼實現了分隔鏈表

    主要思路是分紅小於某數的兩個鏈表, 分開操做, 最後再合成鏈表的思路, 代碼實現比較簡單。

import LinkedList from './LinkedList';
// 實現一個鏈表
const partition = (head, x) => {
  // 分紅2個結點
  let cur = head,
    next, 
    preHead, //小於的
    preTail,
    afterHead, //大於或等於鏈表
    afterTail;
  
  if (head === null)
    return null;
  while (cur) { //一次遍歷 
    next = cur.next;
    cur.next = null; // 打掉之前的關係 
    if (cur.val < x) {
      if (!preHead) { //空鏈表
        preHead = cur;
        preTail = cur;
      } else {
        preTail.next = cur;
        preTail = cur;
      }
    } else {
      if (!afterHead) { //空鏈表
        afterHead = cur;
        afterTail = cur;
      } else {
        afterTail.next = cur;
        afterTail = cur;
      }
    }
    cur = next;
  } 
  if (preTail) {
    preTail.next = afterHead;
    return preHead;
  } else {
    return afterHead;
  }
  
}
const list = new LinkedList();
// 1->4->3->2->5->2 
list
  .append(1)
  .append(4)
  .append(3)
  .append(2)
  .append(5)
  .append(2)
// console.log(list.toString());
const newHead = partition(list.head, 3);
console.log(newHead);
let curNode = newHead;
while(curNode) {
  console.log(curNode.val);
  curNode = curNode.next;
}
複製代碼

總結

以上我主要將本身學習leetcode 的方式和參考的開源項目,分享給你們,但願對你們有所幫助, 謝謝。 代碼

相關文章
相關標籤/搜索