前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >20181007_ARTS_week15

20181007_ARTS_week15

作者头像
Bob.Chen
发布2018-10-11 14:35:42
3390
发布2018-10-11 14:35:42
举报
文章被收录于专栏:程序员的诗和远方

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

Algorithm

代码语言:javascript
复制
/**
 * 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 以及实际值,所以比较条件写的有点复杂,因为要构造一个新的单链表,空间复杂度也比较高。

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

代码语言:javascript
复制
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'),这个时候可以对你的模块做一些处理,兼容两种情况:

代码语言:javascript
复制
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 的东西。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Algorithm
  • Review
  • Tip
  • Share
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档