第十五周 ARTS,算法题 Merge Two Sorted Lists,看了一篇讲为什么选择 NodeJS 作为脚本语言的文章,分享了让 node 模块既可以作为脚本被命令行使用又可以作为模块被引用的 tip,分享了日常中看到的吃嚼碎了的知识的现象与看法。
/**
* 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;
};
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 更好的三个理由。
作者给出的三个理由其实并没有特别大的说服力,脚本语言的选择很多,并不一定说 NodeJs 就比 Python 能好多少,关键还是看使用场景以及使用人的熟悉程度。
不过我还是推荐 Python 的,毕竟人生苦短。
在 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/
这周耗子哥在专栏结束语中写了这样几句话:
大多数人都失去了获取知识的能力,你就算把知识放放在他们面前,他们也不会去学习,他们需要你喂,甚至需要你帮他们嚼碎了,帮他们消化过了,他们才能吃得到,消化得了。
真的是说的非常有道理。平常写代码的时候有时会有这样一个情况,遇到一些问题先去网上搜,而不是先找找文档,这其实也是一个吃别人消化过的问题的现象。
如果搜到解决方案之后再了解下原理,摸索一下解决的过程,这样也还挺好,最怕就是不求甚解,把代码一个 copy 就完事了。
所以有时候,网上很多人问类似的东西怎么写,就是某个东西稍微变一变,就不一样的,哪有那么多百分百 match 的东西。
看得懂,学的会,用得着方为学习之道。