Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ARTS 第十六周(2019.7.15~2019.7.21) #16

Open
catcuts opened this issue Jul 21, 2019 · 0 comments
Open

ARTS 第十六周(2019.7.15~2019.7.21) #16

catcuts opened this issue Jul 21, 2019 · 0 comments
Labels

Comments

@catcuts
Copy link
Owner

catcuts commented Jul 21, 2019

ARTS 第十六周(2019.7.15~2019.7.21)

Algorithm 实现strStr()

题目:

实现strStr()

代码

/**
 * @param {string} haystack
 * @param {string} needle
 * @return {number}
 */
var strStr = function(haystack, needle) {
    if (!needle) return 0;
    let i = 0,  // haystack 的索引
        j = 1,  // needle 的索引,从 1 开始,因为只有 needle[0] === haystack[i] 才会开始遍历 needle
        haystackLen = haystack.length, 
        needleLen = needle.length, 
        needleHead = needle[0];  // needle 的首个元素
    while (haystackLen - i >= needleLen) {  // 遍历 haystack,如果 haystack 剩下的长度不足以覆盖 needle 的长度,此时还没找到满足条件的索引,那么不用再遍历了,返回 -1
        if (haystack[i] === needleHead) {  // 期间,如果 haystack[i] === needle[0] 则说明有戏
            if (needleLen === 1) return 0;  // 而如果此时 needle 的长度为 1 那么就可以直接返回结果是 0
            // 否则就从第 1 个元素开始遍历 needle
            let k = i + 1;  // 注意不要直接在 i 上递增,因为此时的 i 值今后还要用到(不论此次遍历能确认满足条件与否)
            while (j < needleLen) {
                if (haystack[k] !== needle[j]) {  // 一旦出现不相等的
                    j = 1;  // 就重置 j
                    break;  // 停止对 needle 的遍历,然后从 i++ 开始继续遍历 haystack
                } else {
                    k++;
                    j++;
                }
            }
            if (j === needleLen) return i;  // 全等,返回结果 i
        }
        i++;
    }
    return -1;
};

思路:
见注释。

对比:
与高分对比:
本代码运行 74 个测试用例花费约 68ms,平均一个测试用例约 0.9ms;
高分代码运行 74 个测试用例花费约 68ms,平均一个测试用例约 0.9ms。

附最高分代码:

/**
 * @param {string} haystack
 * @param {string} needle
 * @return {number}
 */
var strStr = function(haystack, needle) {
    return haystack.indexOf(needle);
}

我们的代码就是手动实现了原生的 indexOf 函数的这种功能。

Review Yarn PnP 助你摆脱 node_modules

阅读:
How to get rid of node_modules with Yarn Plug’n’Play

点评:
node_moduels 三大罪状:

  1. 太多: 一个项目显式用到的第三方依赖模块可能不多,但是这些依赖模块的依赖们加起来就不少了,这就导致实际的 node_modules 显得及其庞大,并且当多个项目时,每个项目的相同依赖并不能共享,而只能一个项目一个副本地存到 node_modules
  2. 太深: 依赖路径往往嵌套很深
  3. 太慢: 当程序 require 一个模块时,node 就要分析依赖,并且当检查依赖不存在时向上级文件夹遍历,于是导致了大量消耗性能的磁盘 IO 操作

用 yarn 来替代 npm 作为模块管理器,优化了下载模式,使得 yarn install 速度远高于 npm install

但是 yarn 还是继承了 npm 的 node_module 的三个问题,根本原因在于 yarn 没有抛弃 node_modules

现在,从 yarn 1.12 版本开始,就可以启用 yarn 的 pnp 特性,来彻底摆脱 node_modules 文件夹

说来也很简单,就是用 yarn 的缓存文件夹代替 node_modules 文件夹就好了,
这样不同项目的依赖就可以共用,而且其它项目安装过的依赖本项目就可以不用安装

而且当我们需要调试依赖时,也就是修改本项目依赖模块中的代码(但是不想影响其它项目的使用),
还可以使用 yarn unplug packageName 来将某个指定依赖拷贝到项目中的 .pnp/unplugged 目录下,
之后 .pnp.js 中的 resolver 就会自动加载这个 unplug 的版本,
调试完毕后,再执行 yarn unplug --clear packageName 可移除本地 .pnp/unplugged 中的对应依赖。

风险: yarn pnp 直接删除了 node_modules 可能导致某些依赖这个文件夹的第三方模块工作异常。
yarn pnp 还是个新特性,甚至是实验性质的,因此慎用。

另外还参考了:

Tips

Tip1 解决 electron 安装卡在 node install.js

原因:下载 electron 相关包速度太慢,甚至慢到拉取不到(甚至翻墙也没用)
解决方法就是更换 electron 包的镜像源:在 ~/.npmrc 中添加一行:electron_mirror="https://npm.taobao.org/mirrors/electron/"
注意:如果要用 sudo,则应修改 /root/.npmrc

参考:eletron安装卡在 node install.js

Tip2 pm2 在 start 之前应先 delete

否则一些在 start 中指定的参数就不会生效。

Share [他]理解OAuth 2.0

本周原创停更一回,分享一篇他山之玉 理解OAuth 2.0
我们的项目以后可能会用到 OAuth,提前了解下,下周再原创一篇对 OAuth 的理解总结。

@catcuts catcuts added the ARTS label Jul 21, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant