你和名企的距离,差的不只是985/211或研究生学历

4,693 阅读4分钟

今天高考结束了, 或许有些热爱代码的00后同学,看到网上公布的答案,开始估分,自已离985/211就差做错或少做一道题, 感觉没戏,来社区看代码来了。我在很多年前,考上的也是双非学校。虽然有一点怪自己懵懂暗恋上的女同桌在一个考场前后桌,在考场上发挥不佳,但是,每门功课,对偏难的题目,从不跃雷池一步,内心有些双非能力的设定, 不无关系。

即然已经工作写代码了, 还是写了多年前端的老司机,想给双非学校并在准备秋招的前端同学说一句,算法真的很重要,就像高考时,数学的最后一两道题,答对了,能进985/211,答不对,就是双非学校。而在秋招中, 算法题答不好,很难进名企。

leetcode正流行

且不说,宇宙条,前端面试考的是一堆算法题,腾讯/阿里,二面或三面有专门的算法在线笔试题。上半年,github最火的开源项目里,好几个leetcode相关的项目。随着leetcode越来越流行,留给前端实习同学过一遍排序算法,就能拿还不差公司offer的好日子怕是没有了。

  • leetcode题解 来自兑吧的lucifer, 之前也看他写的从零开始写一个webpack200行代码实现 mini-React 等前端面试中等别有用的技术解析。作者以自己解leetcode 的思路和面试的考查点,解构了leetcode题库,非常推荐。
  • leetcode animation 来自程序员吴师兄, 3万+ start的神开源项目,正是它让对leetcode 的理解动画起来,并且带起来了leetcode学习风,不可错过。有了它,不会算法,是借口。
  • 极客时间王争老师的数据结构与算法之美

要去名企,先去leetcode官网解题

面试及在线写代码,用牛客网, 我建议要高效学习,使用上各种学习神器及在线学习产品。因为大厂面试时, 为了提高效率, 直接或间接地采用了这些在线测试产品,同时,最重要的是,它让我们对于算法的学习,被记录下来, leetcode学习可以被证明。

有新意的leetcode学习方式分享

我想在这里, 给大家分享一份比较适合前端, 可视化, es6, 简单易上手的解题策略。

leetcode 86题链表分隔

链表分隔, 是一道数据结构链表的基础考查题,题目如下:

给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。

输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
  • leetcode Animation 看图解, 事实上, 大多数时候,我是跟着吴师兄,来解leetcode的题的。总能随着他的算法动画,get到算法的解题意图。

  • 来自trekhleb

trekhleb的数据结构实现,非常nice, 强力推荐,我在刷leetcode 数据结构类题目时,使用trekhleb的代码来实现

结点代码

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 的方式和参考的开源项目,分享给大家,希望对大家有所帮助, 谢谢。 代码