美文网首页Android开发Android开发经验谈程序员
你和名企的距离,差的不只是985/211或研究生学历

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

作者: Android开发架构 | 来源:发表于2019-06-14 20:33 被阅读8次

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

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

    leetcode正流行

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

    • leetcode题解 来自兑吧的lucifer, 之前也看他写的从零开始写一个webpack、200行代码实现 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 的方式和参考的开源项目,分享给大家,希望对大家有所帮助, 谢谢。

    Android开发资料+面试架构资料 免费分享 点击链接 即可领取

    《Android架构师必备学习资源免费领取(架构视频+面试专题文档+学习笔记)》

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/hykmfctx.html