用 JavaScript 实现链表操作 - 18 Recursive Reverse

2017-02-25
阅读 1 分钟
2.9k
麻烦的地方就在最后,把节点加入链表的末尾需要首先遍历整个链表,这无疑非常低效。我们在上一个 kata 的循环里是怎么解决的呢?维护一个 result 变量代表反转链表,然后每次把新节点放到 result 的头部,同时把新节点当做新的 result ,大概这个样子:

用 JavaScript 实现链表操作 - 17 Iterative Reverse

2017-02-24
阅读 1 分钟
2.5k
思路是,从前到后遍历链表,对每个节点复制一份,并让它的 next 指向前一个节点。最后 result 就是一个反转的新链表了。那么如何修改 list 呢?很简单,把 result 的首节点值赋给 list ,然后让 list 指向 result 的第二个节点就行。

用 JavaScript 实现链表操作 - 16 Sorted Intersect

2017-02-20
阅读 2 分钟
2k
实现函数 sortedIntersect() 取两个已排序的链表的交集,交集指两个链表都有的节点,节点不一定连续。每个链表应该只遍历一次。结果链表中不能包含重复的节点。

用 JavaScript 实现链表操作 - 15 Merge Sort

2017-02-18
阅读 1 分钟
2.7k
实现函数 mergeSort() 进行归并排序。注意这种排序法需要使用递归。在 frontBackSplit() 和 sortedMerge() 两个函数的帮助下,你可以很轻松的写一个递归的排序。基本算法是,把一个链表切分成两个更小的链表,递归地对它们进行排序,最终把两个排好序的小链表合成完整的链表。

用 JavaScript 实现链表操作 - 14 Sorted Merge

2017-02-18
阅读 2 分钟
2.2k
实现函数 sortedMerge() 把两个升序排列的链表合并成一个新链表,新链表也必须是升序排列的。这个函数应该对每个输入的链表都只遍历一次。

用 JavaScript 实现链表操作 - 13 Shuffle Merge

2017-02-18
阅读 2 分钟
2.2k
实现函数 shuffleMerge() 把两个链表合并成一个。新链表的节点是交叉从两个链表中取的。这叫洗牌合并。举个例子,当传入的链表为 1 -> 2 -> 3 -> null 和 7 -> 13 -> 1 -> null 时,合并后的链表为 1 -> 7 -> 2 -> 13 -> 3 -> 1 -> null 。如果合并过程中一个链表的数据先取完了,...

用 PostgreSQL 的 COPY 导入导出 CSV

2017-02-12
阅读 1 分钟
29.5k
无意中看到了一篇讲 数据批量导入 的文章,才注意到 PostgreSQL 的 COPY 命令。简而言之,它用来在文件和数据库之间复制数据,效率非常高,并且支持 CSV 。

用 JavaScript 实现链表操作 - 12 Front Back Split

2017-02-03
阅读 3 分钟
3.4k
实现函数 frontBackSplit() 把链表居中切分成两个子链表 -- 一个前半部分,另一个后半部分。如果节点数为奇数,则多余的节点应该归类到前半部分中。例子如下,注意 front 和 back 是作为空链表被函数修改的,所以这个函数不需要返回值。

用 JavaScript 实现链表操作 - 11 Alternating Split

2017-02-02
阅读 2 分钟
2.4k
实现一个 alternatingSplit() 函数,把一个链表切分成两个。子链表的节点应该是在父链表中交替出现的。如果原链表是 a -> b -> a -> b -> a -> null ,则两个子链表分别为 a -> a -> a -> null 和 b -> b -> null 。

用 JavaScript 实现链表操作 - 10 Move Node In-place

2017-01-11
阅读 2 分钟
3k
TL;DR 用 in-place 的方式把一个链表的首节点移到另一个链表(不改变链表的引用),系列目录见 前言和目录 。 需求 实现一个 moveNode() 函数,把源链表的头结点移到目标链表的开头。要求是不能修改两个链表的引用。 {代码...} 当碰到以下的情况应该抛出异常: 源链表为 null 目标链表为 null 源链表是空节点,data 属性...

用 JavaScript 实现链表操作 - 09 Move Node

2017-01-08
阅读 1 分钟
2.4k
实现一个 moveNode() 函数,把源链表的头节点移到目标链表。当源链表为空时函数应抛出异常。为了简化起见,我们会用一个 Context 对象来存储改变后的源链表和目标链表的引用。它也是函数的返回值。

用 JavaScript 实现链表操作 - 08 Remove Duplicates

2017-01-08
阅读 4 分钟
5k
实现一个 removeDuplicates() 函数,给定一个升序排列过的链表,去除链表中重复的元素,并返回修改后的链表。理想情况下链表只应该被遍历一次。

用 JavaScript 实现链表操作 - 07 Append

2017-01-08
阅读 1 分钟
2.5k
append 本身就可以作为递归的逻辑。append(listA, listB) 实际上等于 listA.next = append(listA.next, listB) ,直到 listA 递归到末尾 null ,这时 append(null, listB) 直接返回 listB 即可。加上边界条件判断,代码如下:

2016 年度总结 - 明确方向,养成习惯

2017-01-02
阅读 3 分钟
3k
又到了年度总结的时候了。有人说年度总结是一个 “感觉还是干了很多事嘛” 的自我催眠,虽然我感觉不是如此,但文章也难逃这个套路。不过无论客观与否,总结这事情也只有自己是最大的受益者,因为一年的经历浓缩成数行文字,其背后隐藏的意义只有当事人有最深刻的理解,对旁人的借鉴意义十分有限。这篇放到博客上,更多的...

用 JavaScript 实现链表操作 - 06 Insert Sort

2016-12-31
阅读 2 分钟
3.2k
实现一个 insertSort() 函数对链表进行升序排列(插入排序)。实现过程中可以使用 上一个 kata 中的 sortedInsert() 函数。insertSort() 函数接受链表头为参数并返回排序后的链表头。

用 JavaScript 实现链表操作 - 05 Sorted Insert

2016-12-25
阅读 3 分钟
2.5k
写一个 sortedInsert() 函数,把一个节点插入一个已排序的链表中,链表为升序排列。这个函数接受两个参数:一个链表的头节点和一个数据,并且始终返回新链表的头节点。

用 JavaScript 实现链表操作 - 04 Insert Nth Node

2016-12-14
阅读 3 分钟
2.8k
insertNth() 可以看成是 01 Push & Build List 中的 push() 函数的更通用版本。给定一个链表,一个范围在 0..length 内的索引号,和一个数据,这个函数会生成一个新的节点并插入到指定的索引位置,并始终返回链表的头。

用 JavaScript 实现链表操作 - 03 Get Nth Node

2016-12-08
阅读 1 分钟
2.2k
实现一个 getNth() 方法,传入一个链表和一个索引,返回索引代表的节点。索引以 0 为起始,第一个元素索引为 0 ,第二个为 1 ,以此类推。比如:

用 JavaScript 实现链表操作 - 02 Length & Count

2016-12-04
阅读 2 分钟
4.7k
递归是最有表达力的版本。思路非常简单。每个链表的长度 length(head) 都等于 1 + length(head.next) 。空链表长度为 0 。

用 JavaScript 实现链表操作 - 01 Push & Build List

2016-11-28
阅读 2 分钟
3.8k
写两个方法 push 和 buildList 来初始化链表。尝试在 buildList 中使用 push 。下面的例子中我用 a -> b -> c 来表示链表,这是为了书写方便,并不是 JavaScript 的有效语法。

用 JavaScript 实现链表操作 - 前言和目录

2016-11-20
阅读 1 分钟
3.7k
我打算写一个链表操作的系列,来自 Codewars 的 Linked List 系列 kata ,实现语言是 JavaScript 。这篇是开篇,简单描述了一下我写这个的目的,也作为系列的目录。

Does Rails Hurt?

2016-11-18
阅读 3 分钟
3k
看完后我觉得作者有些断章取义和偷换概念,因此有了这篇文章。主要是想探讨一下,Rails 真的 Hurts 吗?下面我们根据原文的结构一条一条来分析(吐槽)。

Kata: 下一个更大的数字

2016-09-10
阅读 3 分钟
4.3k
这是一个 Coderwars 上的练习,等级 4kyu 。Coderwars 上的题目分为 8 级,数字越小越难。这题算是中等难度。下面是我的分析和解法,语言使用的 JavaScript ,但你也可以用任何其他语言来实现。

React PureComponent 源码解析

2016-08-28
阅读 4 分钟
20.3k
React 15.3.0 新增了一个 PureComponent 类,以 ES2015 class 的方式方便地定义纯组件 (pure component)。这篇文章分析了一下源码实现,并衍生探讨了下 shallowCompare 和 PureRenderMixin。相关的 GitHub PR 在 这里 。

使用 Reek 检查 feature branch 相关文件的 code smell

2016-08-24
阅读 2 分钟
3.4k
最近为 Rails 项目加了一个代码分析工具叫 Reek ,用来检查代码中的坏味道。因为项目已经有一段时间了,一跑就几百个提示。平时也没工夫专门优化代码。于是我想到一个折中的办法:只检查 feature branch 中修改了的文件,针对性地优化。

Cordova 打包 Android release app 过程详解

2016-05-22
阅读 3 分钟
23.3k
Android app 的打包分为 debug 和 release 两种,后者是用来发布到应用商店的版本。这篇文章会告诉你 Cordova 如何打包 Android release 版本,也会让你了解 Android app 的打包流程。

Ruby String/Integer/Array 的一些不常用方法

2016-04-10
阅读 1 分钟
2.3k
TL;DR 仅用于个人整理,对他人无甚帮助。有段时间练习算法,我记录了一些数据操作的方法,它们都不太常用,所以单独写篇博客保存。 String bytes 返回 byte 数组,适合获取 codepoint 。 center 把 str 居中,两边填充 padstr ,默认为空格。 chars 返回 character 数组。 codepoints 返回 codepoint 数组。 {代码...} I...

Angular 根据 service 的状态更新 directive

2016-04-01
阅读 4 分钟
2.9k
这篇文章讲解了三种根据 service 的状态更新 directive 的做法。分别是 $watch 表达式,事件传递,和 controller 的计算属性。

Angular $rootScope:inprog 问题探究

2016-03-31
阅读 2 分钟
17.1k
这几天在写一个 service 。这个 service 中有个状态需要注入到 directive 中做页面展现。因为状态的改变由另一个插件控制,不在 Angular 的 event loop 中。为了触发 dirty-checking 我在 service 中调用了 $rootScope.$digest() 。

JavaScript ASI 机制详解

2016-03-06
阅读 6 分钟
13k
最近在清理 Pocket 的未读列表,看到了 An Open Letter to JavaScript Leaders Regarding Semicolons 才知道了 JavaScript 的 ASI,一种自动插入分号的机制。因为我是 “省略分号风格” 的支持者,之前也碰到过一次因为忽略分号产生的问题,所以对此比较重视,也特意多看了几份文档,但越看心里越模糊。并不是我记不住 ( ...