HandsomeWalker Blog

Thinking will not overcome fear but action will.

双指针思想

双指针

双指针 顾名思义,双指针思想解决问题的思路是利用两个指针,一前一后来遍历数组,或者一个快一个慢来遍历数组,达到降低时间复杂度的目的。典型的二分查找就是利用双指针的思想。 多用于数组或字符串查找问题,如果处理整数数组相关问题,往往需要对数组进行排序 数组问题实例-两数之和 给定一个无序的整数数组nums和一个整数target,在数组里抽取2个整数,使得这两个整数相加后的值最接近target,...

初探动态规划

dp

动态规划与递归 动态规划的思想和递归的思想类似,都是把复杂问题分解成若干小问题来求解。不同的是动态规划解决了重复求解的问题,递归中可能存在重复求解子问题。 比如最简单的兔子数列问题: // 递归 function fib(n) { if (n < 2) { return n; } return fib(n - 1) + fib(n - 2); } 当 n == ...

栈JS实现

栈特点 入栈出栈速度很快,先进后出,能用递归实现的场景,都能使用迭代加栈来实现 构造栈 JS中的数组同时具备栈和队列的特性 function Stack() { this.dataStore = []; this.length = 0; this.top = 0; } Stack.prototype = { push(data) { this.dataStore[t...

hash表JS实现

散列

hash表特点 查找O(1),插入O(1),删除O(1),比较适合无序、需要快速访问的情况,缺点空间复杂度高 hashTable结构 使用开链法解决碰撞处理 [ ['A'], ['abc', 'cba'], ['d'] ] 构建hashTable 首先选取一个合适的质数作为hashTable长度 function getPrimes(n) { var res = [...

链表JS实现

链表

链表特点 查找O(n),插入O(n),删除O(n) 链表结构 { head: { val: 1, next: { val: 2, next: { val: 3, next: null } } } } 构造链表 function Node(val, next) { this.va...

循环队列JS实现

队列

原理 固定长度的队列,队列满的情况下无法入队。通过为队列添加一个size属性,此属性为当前队列中元素的个数,size属性随入队和出队操作发生改变,根据size属性来确定头指针head和尾指针tail的序号。 show me the code function circleQue(length) { this.dataStore = []; this.head = 0; this...

图和图算法JS实现

dfs,bfs,最短路径

图特点 查找O(n),插入O(1),删除O(n) 基础图 邻接表 [ [1, 2], [0, 3], [0, 4], [1], [2] ]; show me the code function Graph(v) { // 顶点数 this.vertices = v; // 边数 this.edges = 0; // 邻接表 this....

BST(二叉搜索树)JS实现

二叉树

BST特点 查找O(logn),插入O(logn),删除O(logn) 生成二叉树 二叉树大致结构: { root: { left: { val: 1, left: null, right: null }, right: { val: 10, left: null, right: nul...

动手写一个webpack loader

loader

简介 首先看一段webpack配置项 { module: { rules: [ { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: "url-loader", options: { limit: 10000, name: utils.a...

浅析FE涉及到的协程

浅析协程

何谓协程 与子例程一样,协程也是一种程序组件。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。协程源自Simula和Modula-2语言,但也有其他语言支持。协程更适合于用来实现彼此熟悉的程序组件,如合作式多任务,迭代器,无限列表和管道。 协程最初在1963年被提出。 以上是wiki中给出的简介,子例程即是我们所说的函数。子例程一旦执行正常情况下就会执行到底,...