周末植物园烧烤December 10, 2007

秋意盎浓,在 工作劳累 的同时还是需要去放松一下的,于是就去植物园烧烤。
很荣幸能和 Badbuild 两口子参加此次的聚会,可惜的是由于 ppeng 兄弟 临时有事、 wiLdGoose 兄弟 打我电话的时候已经是深夜了(汗,他又通宵了),他们俩没能出席。

想不到来烧烤的人非常的多,我到目的地时候小蒋同学已经搭灶生火了。

三番五除下,突破了各种技术壁垒,这可怜的灶还是硬生生给我们生起来了。

凌乱的桌子,上面摆满了各种作案工具(但愿蒋同学的小手没有吓到花花草草)。

不过依照本人以往的经验,我最拿手的还是里脊和玉米了。不过似乎女生们都很喜欢鸭胗。

本人的成果特写,做法:将玉米掺入油和椒盐,然后用锡纸包起来扔到碳里烤熟即可。我扔了三个下去,逐一都被我全部消灭,非常的有成就感(可惜被 BigHead 大姐说就是样子寒碜了点)。

到后期烧烤演变成了烧饭,在这里鄙视一下。牛柳 + 青菜 + 香菇 = 香菇青菜炒牛柳。由于工具问题,消灭的都是青菜和香菇,牛柳只能消灭大块的。

再次对 Badbuild 的生火技术感到敬佩,在他的努力之下我们的番薯终于是能熟得吃了。

最后,据说 某人 的朋友 说植物园没有枫树,我在这里辟谣一下 -- 人家枫哥不是活得好好的嘛。在回来的路有还有更意想不到的惊喜。在这里我先卖一个关子,等整理好了以后再放上来。请大家持续关注 :^)
请给 Array 本地对象增加一个原型方法,它的用途是删除数组条目中重复的条目(可能有多个),
返回值是一个包含被删除的重复条目的新数组。
Lazy 兄弟给出了它自己的解法,而我个人认为这样的解法算法上还有需要改进的地方。正如回复中 fdcn 兄弟所说,如果将数组:[1, 2, 3, 3, null, null, 2] 带入 Lazy 兄的函数,那么按照循环判断条件就会退出,导致数组之后的元素就不会判断了。
下面给出我的解决方法:
Array.prototype.uniq = function(){
var tmp = new Array;
var length = this.length;
for(var i = 0; i < length; i++) {
var push = true;
var item = this[i];
for(var j = i + 1; j < length; j++) {
if(this[j] == item) {
push = false;
}
}
if(push == true) {
tmp.push(item)
}
}
return tmp;
}
Lazy 兄弟也说到每次循环都将重新计算 length 会有开销,那么我将 legth 定义为一个常量,原数组为「只读」,那么 length 相对不变,就不要重复计算了。然后再定义一个数组往里面扔「垃圾」。
数组嵌套循环并不遍历原数组的每一个元素,仅判断剩余没有出现的值。最后获得一个是否 push 的布尔值,然后跳出循环判断是否插入。
最后,欢迎大家交流讨论。
更新,和 Lazy 兄弟讨论后,我发现此函数写得也不是非常的严谨。因为它没有修改原函数的元素,于是我又作了如下的修改:
Array.prototype.uniq = function(){
var tmp = new Array;
var length = this.length;
for(var i = 0; i < length; i++) {
var push = true;
var item = this[i];
for(var j = i + 1; j < length; j++) {
if(this[j] == item) {
push = false;
}
}
if(push) {
tmp.push(item)
}
}
this.length = tmp.length;
for (var i = 0; i < tmp.length; i++) {
this[i] = tmp[i];
}
return tmp;
}
但这样又出现了一个问题,就是重复赋值会不会增加时间长度。因为我是在取出来了以后再做一次循环重新赋值给原数组。按照我这样的写法实现已经没有问题,但是效率可能需要进一步的调整。
继续改进ing
不好意思,再次更新。根据上述的问题,我重新优化了下算法,并将 Lazy 兄弟的「思想」加了进来,于是就有如下的代码了:
Array.prototype.uniq = function(){
var i = 0, j = 0;
while (undefined !== this[i]){
j = i + 1;
while(undefined !== this[j]){
if (this[i] === this[j]) {
this.splice(j, 1);
}
++j;
}
++i;
}
return this;
}
是的,非常的短,不过却能完成题目所给的要求了。这个相对我以前的函数,有一个好处就是没有生成另外的一个数组。而且也没有像第二个函数这样的重复赋值。
嗯,我想目前这个样子已经能满足题目的要求了。
Cscope 确实能给开发带来不少的方便。这篇篇幅不长的 Vim/Cscope 入门指导 可以让大家很快熟悉怎么使用 Vim 编辑器 调用 Cscope。
由于翻译的时间比较短(加上本人水平不高又很懒),有错误的地方请兄弟们不吝指出。废话不多说,下面是一些下载链接:
HTML 版本 PDF 版本 ZIP 打包(PDF 版本)
另,需要学习 Vim 的朋友可以看下上次翻译的 清单式学习 VI 编辑器 文档。
-- UPDATE--
2008-09-24 更改下载链接