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.11.25~2019.12.01) #22

Open
catcuts opened this issue Dec 3, 2019 · 0 comments
Open

ARTS 第二十二周(2019.11.25~2019.12.01) #22

catcuts opened this issue Dec 3, 2019 · 0 comments
Labels

Comments

@catcuts
Copy link
Owner

catcuts commented Dec 3, 2019

ARTS 第二十二周(2019.11.25~2019.12.01)

Algorithm 旋转链表(中等难度)

题目
旋转链表(中等难度)

代码

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var rotateRight = function(head, k) {
    // 不旋转 或 空节点 或 单节点,则直接返回
    if (!k || !head || !head.next) return head;

    // 链表长度(初始假定值)
    let len = k;

    // 第二指针
    let second = head;
    // 先移动第二指针 k 次
    while (k--) {
        second = second.next;
        // 如果移动到了 null 节点
        if (!second) {
            // 重新计算 k
            len -= k;
            k = k % len;
            // 如果 k !== 0 则从头移动
            if (k) {
                second = head;
            }
            // 如果 k === 0 则直接返回头节点(因为无需移动)
            else {
                return head;
            }
        }
    }
    // 如果出了上一个循环而没有直接返回
    // 则设置第一指针
    let first = head;
    // 然后移动双指针
    while (true) {
        if (second.next) {
            first = first.next;
            second = second.next;
        }
        // 如果第二指针的下一个节点为 null
        else {  // 此时
            // 第一指针的下一个节点作为新的头节点
            let newHead = first.next;
            // 第一指针的节点作为新的尾节点
            first.next = null;
            // 第二指针的下一个节点设为原来的头节点
            second.next = head;
            // 完成旋转
            return newHead;
        }
    }
};

执行结果:通过
执行用时:64 ms,在所有 javascript 提交中击败了 99.45% 的用户
内存消耗:35.5 MB,在所有 javascript 提交中击败了 36.90% 的用户

思路:
使用递归,详见注释:
// 不旋转 或 空节点 或 单节点,则直接返回
// 链表长度(初始假定值)
// 第二指针
// 先移动第二指针 k 次
  // 如果移动到了 null 节点
    // 重新计算 k
    // 如果 k !== 0 则从头移动
    // 如果 k === 0 则直接返回头节点(因为无需移动)
// 如果出了上一个循环而没有直接返回
// 则设置第一指针
// 然后移动双指针
  // 如果第二指针的下一个节点为 null,此时
    // 第一指针的下一个节点作为新的头节点
    // 第一指针的节点作为新的尾节点
    // 第二指针的下一个节点设为原来的头节点
    // 完成旋转

对比:
与高分对比:
本代码运行 231 个测试用例花费约 64ms,平均一个测试用例约 0.28ms;
高分代码运行 231 个测试用例花费约 64ms,平均一个测试用例约 0.28ms。
思路一致代码略。

Review 推荐几款提升开发效率的在线工具

阅读:
Developer Tools to Increase Your Productivity

点评:
本文推荐了几款提升效率的在线工具:

  1. Web-API 可用性检查工具:Can I Use
    :通过 Web-API 名称搜索其在不同平台上的可用性,以及相关资料如规范等
  2. 代码反压缩工具:Unminify
    :对压缩过的代码进行反压缩,提高可读性
  3. 图片无损压缩工具:Compressor.io
    :平均压缩率 50% 以上,且肉眼看不出区别
  4. 可视化云服务部署工具:Cloudcraft
    :目前只支持 AWS,付费
  5. 多语言集成IDE:Repl.it
    :支持部署各种语言的开发环境,并且直接安装和使用所需的依赖包或库,而无需下载
  6. Http 请求收集器:RequestBin
    :提供一个地址,当客户端向这个地址发送请求时,可以对其进行观察或启动一个工作流
  7. Web 代码生成器:Web Code
    :输入需求自动生成 Web 开发相关代码如 HTML CSS JSON 等并提供预览
  8. 打包恐惧症:BundlePhobia
    :输入 npm 包名,计算其原始与打包后的大小,以及不同网络环境中的预计下载时间
  9. 浏览器指纹生成器:Fingerprint.js
    :一行代码生成浏览器指纹,所谓浏览器指纹,是一种用来区别不同用户浏览器的唯一编码
    :参考 Browser Fingerprinting - What Is It and What Should You Do About It?

Tip 排除法做 Docker 容器数据卷映射

在运行 Docker 容器时,我们可能有这样一种排除法做数据卷映射的需求,如:

  • 容器中的 /path/to/container/appFolder 映射到宿主机 /path/to/host/appFolder
  • 但是容器中的 /path/to/container/appFolder/node_modules 不做映射
    (因为 node_modules 映射到宿主机,要么会出现意想不到的问题,要么需要重新安装)

此时可以直接将映射的左边写为该数据卷的名称(而非路径)即可,如:

docker run -it \
-v /path/to/host/appFolder:/path/to/container/appFolder \
-v node_modules:/path/to/container/appFolder/node_modules \
--name $容器名称 $镜像名称 $命令

Share [极客专栏:数据结构与算法之美] 01 | 为什么要学习数据结构和算法

分享一篇极客专栏《数据结构与算法之美》
01 | 为什么要学习数据结构和算法

课后思考
你为什么要学习数据结构和算法呢?在过去的软件开发中,数据结构和算法在哪些地方帮到了你?

因为数据结构和算法是程序开发的基本功。

基本功没练好就能开发出好的程序,那是假象

——我们以为使用封装好的框架和工具写出能运行和满足业务需求的程序就是高手了,
却往往忽略了性能的重要性。

因此作为一个程序开发者,不论当前的工作是应届毕业生,还是业务工程师,或是业务架构师,
都应该学好数据结构与算法,用好数据结构与算法,才能使自己的代码更优秀,从而自己的水平也能更高更有竞争力。

在工作中,时间复杂度和空间复杂度的分析往往能让我写出的代码区别于其它随性暴力的遍历代码,运行更省时。
虽然公司也没有对这方面的评价,但是只有保持力求上进的精神,才能使自己立于不败之地。

@catcuts catcuts added the ARTS label Dec 3, 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