20181007_ARTS_week15

Posted on 2018-10-07 in ARTS by yucongchen

第十五周 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 的东西。

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


碎碎念

记录一些所思所想,写写科技与人文,写写生活状态,写写读书心得,主要是扯淡和感悟。 欢迎关注,交流。

微信公众号:程序员的诗和远方

公众号ID : MonkeyCoder-Life

程序员的诗和远方