20181007_ARTS_week15

第十五周 ARTS,算法题 Merge Two Sorted Lists,看了一篇讲为什么选择 NodeJS 作为脚本语言的文章,分享了让 node 模块既可以作为脚本被命令行使用又可以作为模块被引用的 tip,分享了日常中看到的吃嚼碎了的知识的现象与看法。

Algorithm

/**
 * Merge Two Sorted Lists
 * https://leetcode.com/problems/merge-two-sorted-lists/description/
 * 
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var mergeTwoLists = function(l1, l2) {
    if (!l1 && !l2 ) {
        return []
    }

    var item = new ListNode();
    var cur = item;

    while(l1 || l2) {
        var val1 = l1 ? l1.val : null;
        var val2 = l2 ? l2.val : null;

        if ((val1 != null && val2 != null) && val1 <= val2) {
            cur.val = val1
            l1 && (l1 = l1.next);
        } else if ((val1 != null && val2 != null) && val1 > val2) {
            cur.val = val2
            l2 && (l2 = l2.next);
        } else {
            var tmpVal1 = l1 ? l1.val : 0;
            var tmpVal2 = l2 ? l2.val : 0;
            cur.val = tmpVal1 ? tmpVal1 : tmpVal2;
            l1 && (l1 = l1.next);
            l2 && (l2 = l2.next);            
        }

        if (l1 || l2) { // 判断是否要加下一个节点
            cur.next = new ListNode();
            cur = cur.next
        }
    }

    return item;
};

这个写的比较杂乱,因为一开始思路就是想着比较大小,然后构造新的节点,赋值,找下一个,做成单链表。因为要比较是否是 null 以及实际值,所以比较条件写的有点复杂,因为要构造一个新的单链表,空间复杂度也比较高。

写完通过测试用例之后看了下别人的解法,直接使用已有的节点,当有一方为空的时候,就返回另外一方,还是挺巧妙的,可以参考一下。

var mergeTwoLists = function(l1, l2) {

    var item = new ListNode();
    var cur = item;

    while(l1 !== null && l2 !== null) {
        var val1 = l1 ? l1.val : null;
        var val2 = l2 ? l2.val : null;

        if ( l1.val <= l2.val) {
            cur.next = l1
            l1 = l1.next;
        } else {
            cur.next = l2
            l2 = l2.next;
        }
        cur = cur.next
    }

    cur.next = l1 !== null ? l1 : l2;

    return item.next;
};

Review

Why I Use NodeJS for Basically Everything I Do.

https://medium.com/@kieranmaher13/why-i-use-nodejs-for-basically-everything-i-do-e0a627787ecc

If you do it more than once, write a script.

作者介绍了他认为 NodeJS 在写脚本方面比 Python C# Go 更好的三个理由。

  • 非 I/O 阻塞
  • 自己保护自己(原文使用:It takes care of itself),这里作者主要讲的是 V8 引擎在自动垃圾回收方面的东西。老实说,我觉得这个不能成为一个特别令人信服的理由。
  • 搭建可交互界面。这里主要说的是网页,老实说,这是个更不能让人信服的理由。

作者给出的三个理由其实并没有特别大的说服力,脚本语言的选择很多,并不一定说 NodeJs 就比 Python 能好多少,关键还是看使用场景以及使用人的熟悉程度。

不过我还是推荐 Python 的,毕竟人生苦短。

Tip

在 node 中,你的模块可能会作为一个脚本本使用,比如 node something.js 或者被别的模块引用,比如 require('something.js'),这个时候可以对你的模块做一些处理,兼容两种情况:

if (!module.parent) {
    // ran with `node something.js`
    app.listen(8088, function() {
        console.log('app listening on port 8088');
    })
} else {
    // used with `require('/.something.js')`
    module.exports = app;
}****

Tip 来源 http://www.jstips.co/en/javascript/nodejs-run-a-module-if-it-is-not-required/

Share

这周耗子哥在专栏结束语中写了这样几句话:

大多数人都失去了获取知识的能力,你就算把知识放放在他们面前,他们也不会去学习,他们需要你喂,甚至需要你帮他们嚼碎了,帮他们消化过了,他们才能吃得到,消化得了。

真的是说的非常有道理。平常写代码的时候有时会有这样一个情况,遇到一些问题先去网上搜,而不是先找找文档,这其实也是一个吃别人消化过的问题的现象。

如果搜到解决方案之后再了解下原理,摸索一下解决的过程,这样也还挺好,最怕就是不求甚解,把代码一个 copy 就完事了。

所以有时候,网上很多人问类似的东西怎么写,就是某个东西稍微变一变,就不一样的,哪有那么多百分百 match 的东西。

看得懂,学的会,用得着方为学习之道。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CDA数据分析师

如何在R中操作非结构化数据?

本文由CDA作者库成员HarryZhu原创,并授权发布。 CDA作者库凝聚原创力量,只做更有价值的分享。 ? 介绍 现代化数据科学中的 DataFrame 概念...

2479
来自专栏Android知识点总结

01--Java核心之JVM引入篇

虚拟机即:虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的 JVM只是一种用于计算设备的规范,广义来说相当于一个接口,而接口的实现可以不...

883
来自专栏PPV课数据科学社区

据说这篇总结覆盖了一般Python开发面试中可能会问到的大部分问题

? 原文标题:一名python web后端开发工程师的面试总结 先介绍下我的情况 通信背景,工作一年多不到两年。之前一直在做C++的MFC软件界面开发工作。公...

5016
来自专栏程序员互动联盟

如何提高编写代码的速度?

如何提高代码编写的速度,一直是一个逃避不了的问题。在天朝你得像打字员一样做程序员,不然老板和上司都觉得你是在玩耍。对项目的贡献体现在哪里?码农难道不是以code...

4118
来自专栏从零开始学自动化测试

新手学习selenium路线图(老司机亲手绘制)

前言: 最近群里有不少小白,想入手selenium,但是一直没找到学习路线,还没入门就迷路了,于是小编亲手绘制了一幅学习路线图。希望能帮助小白快速入门,帮助已经...

3936
来自专栏LuckQI

美团面试经历,贡献出来一起学习

  晚7点,因为想到下周一才面试,我刚准备出去打个羽毛球,北京的电话就来了。面试官各种抱歉,说开会拖延了。 1、自我介绍 说了很多遍了,很流畅捡重点介绍完。...

4792
来自专栏自动化测试实战

我对RF的理解

46510
来自专栏北京马哥教育

据说这篇总结覆盖了一般Python开发面试中可能会问到的大部分问题

先介绍下我的情况 通信背景,工作一年多不到两年。之前一直在做C++的MFC软件界面开发工作。公司为某不景气的国企研究所。(喏,我的工作经验很水:1是方向不对;...

3969
来自专栏大数据文摘

编程新手入门踩过的25个“坑”,你犯过其中哪些错误?

1883
来自专栏程序员的诗和远方

20181118_ARTS_week21

这题一开始一直没思路,然后看了 leetcode 的讨论,这个解法还是比较精妙的,用两个指针,然后距离就是 n,等到最后一个碰到末尾,要踢掉的元素就是 前一个指...

934

扫码关注云+社区

领取腾讯云代金券