js实现二叉树之顺序存储

假设现在我们已经把数据存到数组中:[1, 3, 4, 6, 8, 10, 2, 5],其存储可表示如下:

1.png

对于任意节点,我们怎么找到它的父节点和左右子节点?

1
2
3
4
5
索引为0的节点,没有父节点,左子节点索引为1,右子节点索引为2;
索引为1的节点,父节点索引为0,左子结点索引为3,右子节点索引为4;
索引为2的节点,父节点索引为0,左子结点索引为5,右子节点为索引为6;
...
索引为i的节点,父节点索引为Math.floor((i - 1) / 2),左子结点索引为2i + 1,右字节点为索引为2i + 2

将数组表示二叉树的形式,应该长这样(最左边数字表示树的层序号):

阅读全文

HTML5读取本地文件

常见的语言比如php、shell等,是如何读取文件的呢?

实际上,大多数语言都需要先获取文件句柄,然后调用文件访问接口,打开文件句柄,读取文件!

那么,HTML5是否也是这样的呢?

答案是肯定的!

HTML5为我们提供了一种与本地文件系统交互的标准方式:File Api

该规范主要定义了以下数据结构:

  • File
  • FileList
  • Blob

HTML5访问本地文件系统时,需要先获取File对象句柄,怎么获取文件引用句柄呢?

阅读全文

如何实现一个动画库

原生js做动画?我们都知道最简单的方式就是用setInterval/setTimeout来不断地调用某个绘制函数,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var interval = null;
var button = document.getElementById('test');
var end = 500;
function step() {
var w = parseInt(button.style.width, 10);
var v = Math.min(w + 10, end);
button.style.width = w + 10 + 'px';
if(v >= end) {
clearInterval(interval);
}
}
function start() {
interval = setInterval(step, 1000/ 60);
}
button.onclick = start;

运行此示例:

阅读全文

解决oh-my-zsh加载plugin失败问题

安装完oh-my-zsh之后plugin无法正常工作,怎么办?

我在mac os x系统上很不幸地遇到了这个问题!

添加一个nvm插件:

1
plugins=(git nvm)

之前已经用nvm安装了node,但是重启zsh之后,却发现node command not found

plugin没加载吗? 这个问题困扰了我好几天, 今天终于发现了问题的根源:PATH路径不对

1
2
3
4
plugins=(git nvm)
source $HOME/oh-my-zsh.zsh
export PATH=/usr/local/bin/:/usr/bin/

尼玛,覆盖了PATH,不挂掉才怪!

正确做法应该是:

1
export PATH=$HOME/bin:/usr/local/bin:$PATH

如果你也遇到类似问题,那么请检查你的PATH设置。

mac os x解决chrome ssl报错问题

在mac中用goagent,chrome浏览器上经常会报ssl错误,导入证书后,问题依然存在。

依稀记得在windows系统上可以为chrome添加一个启动参数来忽略ssl错误:

1
--ignore-certificate-errors

那么mac系统上怎么添加呢?用mac的人应该都知道可以用open可以从命令行打开mac的应用程序。

查看了一下open的帮助文档,发现了以下有用的信息:

1
2
3
4
5
6
-a application
Specifies the application to use for opening the file
--args
All remaining arguments are passed to the opened application in the argv parameter to main().
These arguments are not opened or interpreted by the open tool.

阅读全文

zsh中设置ls目录颜色

最近把mac的默认shell从bash改成zsh之后,发现ls之后目录没有颜色,不好区分文件和目录。

之前的bash目录是可以正常显示颜色的,看了一眼bash_profile中的配置,发现有这样的配置:

1
export CLICOLOR=1

于是就尝试把这个配置放到.zshrc文件中,但是没效果!

google了半天之后,发现如果要显示目录颜色,就得配置LS_COLORS或者LSCOLORS,mac这种freeBSD系统采用的是后者:

1
2
3
# LSCOLORS
export LSCOLORS="exfxcxdxbxexexabagacad"
alias ls='ls -G'

打开一个新的终端,ls一下,终于看见了目录颜色!

mac os x设置zsh为默认的shell

最近经常听说zsh必bash好用很多,于是就google一下,结果搜出了一大堆优点,看了一下,有一些特性还真让我感兴趣。

于是就准备玩一玩zsh。

查看了一下mac自带的zsh版本,发现是5.0.2;我又用brew info zsh查看了一下最新版本是5.0.5;哈哈,不用说先更新先:

1
brew install zsh

安装完成后,新版的zsh是安装到/usr/local/bin下的,所以为了使用这货,咱还得修改/etc/shells这个文件:

1
2
3
4
5
sudo vi /etc/shells
# 在文件末尾添加
...
/usr/local/bin/zsh

修改完成之后:

1
chsh -s /usr/local/bin/zsh

现在我们就可以用最新版的zsh了。

js实现快速排序算法

快排是一种常用的排序算法,它的基本步骤如下:

  • 选择基准
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
  • 递归地对两个子序列进行快速排序,直到序列为空或者只有一个元素为止。

在简单的伪代码中,此算法可简单地表示为:

1
2
3
4
5
6
7
8
9
10
11
12
function quicksort(q)
var list less, pivotList, greater
if length(q) ≤ 1 {
return q
} else {
select a pivot value pivot from q
for each x in q except the pivot element
if x < pivot then add x to less
if x ≥ pivot then add x to greater
add pivot to pivotList
return concatenate(quicksort(less), pivotList, quicksort(greater))
}

参考以上伪代码,js可以这么实现快排:

阅读全文

shell重定向

经常会在shell中看到类似如下的命令,啥意思呢?

1
command > /dev/null 2>&1

在shell重定向中出现的数字称之为文件描述符,linux或者osx等系统开启后,会默认打开以下三种特殊的文件描述符:

  • 0:标准输入
  • 1:标准输出
  • 2:标准错误输出

0号文件描述符会从键盘获取数据输入,而12号文件描述符会把数据输出到设备上(命令行终端)。

阅读全文

命令行中回滚svn

在命令行环境下,回滚svn代码有以下两种场景:

改动还未commit

这种情况下,可以先查看一下svn status,看一下哪些文件做了修改:

M    x/xx/xxx.js

找到了修改了的文件,就可以这样:

1
svn revert x/xxx.js

如果想回滚整个目录,可以这样:

1
svn revert . --recursive # .表示当前目录

一旦revert了,本地代码就会丢失,请谨慎操作。

阅读全文