IBM面经(电面)V1

上上周周末参加的笔试,考得感觉一般,很多题目在接下来一周的复习算法和Java的过程中发现自己做错了。这周周一周二发面试通知,但BBS上的消息说IBM把除京沪穗三地以外的学生都BS了。正在残念之时,2号(周二)下午通知了3号上午电面。

因为以前本科的时候面过一次,所以这次没准备啥就上阵了。一开始上来做一个英文的intro,脑子空白了一会儿,嘴里开始蹦单词,手忙脚乱的找电脑里的self intro。对付完这个,没想到下一个还是英文问题。这时我还不知道今天是全英文面。

问题基本是围绕简历来问的。问完了我上次实习的项目,下一个就是Java Web的经历,让谈了谈APIS是干啥的。说到Web,问我对Dojo熟不熟,我只好说我没用过,ExtJS倒是知道咋用。每次我回答完问题,感觉他没有听到他想要的答案,于是就有一段沉默。我只好说So that is something about…来圆场。

技术问题问了Java Threading和数据库查询分析性能调优。第一个糊过去了,第二个实在没做过,扯了一个做项目时用到的Profiling。

小结:对全英文面试完全没准备,每次听到他问:Do you have any exp in …就开始头皮发麻。虽然基本都有经验,但是英文表达跟不上。

结论:对一些很可能问到的英文问题,做事先的准备。比如你解决一个问题的经历,如何管理团队,如何面对变更,项目的简介以及其中的贡献(后面两个之前都有准备,不过似乎还不太够)。

结果:感觉一般,但下午接到了二面通知。4号早上11点。所以,还会有V2。

p.s. 发现yingjiesheng上基本没啥消息,饮水思源倒是好几屏的帖子了。小白。。俺赤裸裸的伸手要你的sjtu号。。。

难得一天睡了懒觉

昨天晚上写完boss要的方案已经10点多了,然后为了犒劳自己按时完成了工作,就开始上淘宝,上麦考林。。非常high的买了300多块钱的东西,然后心满意足的上床睡觉。结果不知道是不是所有的女人都是购物狂的原因,我躺在床上居然睡不着,就开始捯饬刚到手的E66,终于明白手机可以上网有啥好处了——消磨失眠的时光。
不记的几点睡着的,朦胧中记的自己亲手按掉了7点响的闹钟,然后转个身接着睡,又做了无数的梦,再睡醒的时候才意识到时间不对,抓起手表一看,神啊,8点20了!!!
难得睡了一次懒觉,可惜是工作日。。。

#FuckGFW

从Google Reader里keso博客里看到,twitter、bing、live、flickr、blogspot(blogger)全都被封。维基百科还能上,但不知道会支持不知道能够支持多久。也许后天连Google.com都上不去了。是不是某个日子要到了,有人心虚了。

懒得找代理上twitter,twitterfeed会自动从我的博客feed里读取,把标题发送到twitter的消息里。

另外推荐小有名气的木遥的一篇博文: 廿年

更新:月光博客里提到了如何上twitter的办法,推荐方法一,不仅可以更新,也可以看。

不出国不知道书贵

今天学校图书馆搞国外原版新书展销,以为和上次的二手书一样能够淘到一些打折好书,遂一早同小翼等舍友们奔赴图书馆一楼。

到了才发现原来展销的主要目的是给学校图书馆荐购外文书,因为这些书不打折。国外书籍之贵之前也有所耳闻,今天总算见识了。某MM怯怯的问一本中等大小(虽然不该以尺寸论英雄)的hard cover的价钱,答曰150,还是刀,差点把MM吓晕。另有一大叔的书叫价30镑(50刀),却已是中等偏便宜的书了。

这么贵的书,想必即使生活在美元结算的国度也吃不消吧,怪不得上次展销的全是二手书,还看起来那么新。一本算法导论,新书85刀,Amazon上卖59刀,二手的卖30刀左右,用上一两年后估计还能以15-20刀转手,大致也能接受。而如果Kindle上有的话,价格在10刀以内。

想起侯捷和刘江偶尔对国内技术图书定价的抱怨。第一是作者版税太低,第二是像卖白菜似的论斤卖书;而另一方面很多人感叹技术书籍太贵买不起。技术图书这块,算是图书界里受盗版影响比较小的一个小众分类。销量低,印刷成本高,盗版商自然也没有利润空间。技术书作者大多有正式的工作,这部分人工资也不低,所以写书的机会成本也高。两个因素一综合,书价自然也上去了。

而对于技术图书的消费者而言,理论上说,如果一本书能给他带来5000元的收入,扣去了读书所耗费的机会成本3000元,那么这本书即使售价1500,买下来看还能获得500元的收益。图书市场是个垄断竞争的市场,其中有许多卖者。我们也可以选择其他的书,只能给你带来4500元的收入(书不是完全适合你的需求),除去读书机会成本3500(书写得比较前一本糟糕),但只要定价不超过500元,获得的收益就大于购买第一本书。或者消费者可以不买书,为阅读和寻找资料付出更多的成本(比如上网搜资料,看枯燥无味的文档)。

对于技术图书的生产者,作者和出版社而言,他们追求的是利润最大化。图书的成本由固定成本(稿酬、编辑、制版)和变动成本(印刷、运输、分销)组成。销量大摊薄了固定成本,自然定价低。不幸的是技术图书市场销量低,但需求富有弹性(消费者对价格较为敏感,需求却可有可无),因此生产者也没赚到多少钱。这背后同样伤害了消费者,因为没有多少人再愿意花大量时间来写好书。

算法导论教学视频中的911

最近紧跟算法男小翼的步伐,研究点算法相关的问题。不为投身科研,也没太多个人兴趣相关,只是打打基本功,对付找工作的笔试和面试问题。

这基本功,主要就是数据结构+算法,而这一行的最热门书籍莫过于算法导论(Introduction to Algorithm),Knuth大神的TAOCP非我等现有功力所能研究。虽说此书为经典中的经典,但毛病也是有的,就是罗嗦,另外也不够生动。厚厚的1200页的大部头,兼具斗殴砸人睡觉垫头的功能。

正当我读此书昏昏欲睡之时,突然想起来两年多前从Jetty那里拷来的算法导论视频。其英文不难,戴上耳机听基本可以完全听懂,而上课的内容也不深,正好做看书的辅助。

看到第三课Divide and Conquer A的开始时,图中的Leiserson上课前说了一大堆话,我以为是有啥通知没注意,突然听到一个give blood觉得不对,重新拉回开头看发现讲的正是911恐怖袭击。而上课的当天正是2001年9月12日。MIT离纽约和宾州不远,心理冲击是显而易见的。而似乎Leiserson有个同事或者以前博士生碰巧在美联航11号航班上。

放大看Annoucement。第二个就是献血的通知。

我这个应该是旧的视频,在网上看到的都是新版的视频,第三课换成Erik上了。

端午节草泥马围观记(多图)

端午假期第二天,和LP及小翼夫妇前往红山森林动物园慕名前去围观草泥马。以下图片均为小翼摄制。

三只熊猫,一如既往的很懒+很脏:

LP可爱的兄弟,算是今天看到最活跃的动物了:

游乐场里的摩天轮。游乐场4个人只玩了碰碰车,继上次之后我又把膝盖给撞伤了。小小爆料一下,小翼居然不敢坐旋转飞机,哈哈。

狮虎兽。搞这东西人类造孽了

小袋鼠。才知道原来袋鼠不会走,除了跳以外,剩下的移动方式就是用前肢和尾巴做支撑,把后腿腾空后往前挪,看起来很笨。

今天终于看到了企鹅,了却了LP的心愿。

运气不错,碰上了企鹅吃饭。

这些家伙还很挑剔,不小心掉到地上的鱼就不吃了。

只认钱不认人的鹦鹉正在被一坨硬币调戏中,不知能否识别假币

最后是今天的主角:草泥马两只。那只黑白的比较像百度上的草泥马,可惜一直在后面吃东西

这只长得不像,倒是凑了上来

中间还看了小猪跳水,可怜的LP被溅起的脏水喷了一身。。在此cmft。。

KMP算法简介及简单Java实现

继续复习算法+数据结构。今天简单写写KMP算法,不是那个KMPLAYER。。。同时这个话题也有很优秀的博文介绍,如Matrix67,我这里只是做些简单的小结。
KMP算法用于字符串的模式匹配,也就是查找某个字符串里是否存在某个子串,并返回位置,也就是Java/C++里的String.indexOf()方法。  字符串匹配最朴素的算法就是一个一个去比较,出错了就回溯到下一个起点继续比较。这样的复杂度有O(mn),即原字符串×匹配串。而KMP算法能把时间复杂度降到O(m+n)。KMP这个缩写来自于Knuth,Morris和Pratt,瞬间想到了AVL树。
前面提到,朴素的匹配算法在出错后需要回溯到原来起点。但KMP不需要回溯到起点,直接从出错的位置继续进行比较,从而达到了O(n)。之所以不需要回溯,KMP的秘诀在于其用匹配串(Pattern)计算出来的一个数组F。每当进行字符串的比较卡壳在匹配串的第j个位置时(即Target[i] != Pattern[j]),查阅这个数组F,就可以知道下一次比较时j的值。举个例子:

  • Source串(Target):            a b a b a b a b a c b
  • 匹配串(Pattern):                a b a b a c b
  • 根据Pattern得出的数组F: 0 0 1 2 3 0 0 (P怎么计算的后面会讲)

一一比较到第五个时前面的字符串都相等,到第六个时,由于Target[5] != Pattern[5],所以需要知道下一次比较时,新的j值。j值越大,省略的比较越多。对于朴素的匹配算法,一旦卡壳在位置j,则下一次直接把j置0,即从第一个开始比较,并且回到这次比较的起点。而KMP则是得到新的j值(新的j值显然小于当前j值),并且不回到比较的起点,而是从这个地方继续比较下去,不吃回头草。
回到刚才的例子:

i:       0 1 2 3 4 5 6 7 8 9 .
Target:  a b a b a b a b a c b
Pattern: a b a b a c b
F:       0 0 1 2 3 0 0
j:       0 1 2 3 4 5 6

在j==5的地方,比较卡壳了,因为这时Target[5] != Pattern[5],于是我们查找这时的F[j-1]==3,把j退回到3,继续比较。

i:       0 1 2 3 4 5 6 7 8 9 .
Target:  a b a b a b a b a c b
Pattern:     a b a b a c b
F:           0 0 1 2 3 0 0
j:           0 1 2 3 4 5 6

这个时候发现Target[i] == Patern[j],于是继续前进

i:       0 1 2 3 4 5 6 7 8 9 .
Target:  a b a b a b a b a c b
Pattern:     a b a b a c b
F:           0 0 1 2 3 0 0
j:           0 1 2 3 4 5 6

到i=7, j=5时,比较又卡壳了。故伎重演,设j=F[j-1](如果依然Target[i] != Pattern[j],则j=F[j-1]直到j=0。 如果这时候仍然 Target[i] !=Pattern[j],就需要跳过Target[i]了)

i:       0 1 2 3 4 5 6 7 8 9 .
Target:  a b a b a b a b a c b
Pattern:         a b a b a c b
F:               0 0 1 2 3 0 0
j:               0 1 2 3 4 5 6

剩下就一路比较到结束。
如果把目标字符串(Target)改成abababadcb:

i:       0 1 2 3 4 5 6 7 8 9 .
Target:  a b a b a b a d a c b
Pattern:         a b a b a c b
F:               0 0 1 2 3 0 0
j:               0 1 2 3 4 5 6

Target[i] != Pattern[j], 则j = F[j-1] = 1

i:       0 1 2 3 4 5 6 7 8 9 .
Target:  a b a b a b a d a c b
Pattern:             a b a b a c b
F:                   0 0 1 2 3 0 0
j:                   0 1 2 3 4 5 6

仍然Target[i] != Pattern[j],则j = F[j-1] = 0

i:       0 1 2 3 4 5 6 7 8 9 .
Target:  a b a b a b a d a c b
Pattern:               a b a b a c b
F:                     0 0 1 2 3 0 0
j:                     0 1 2 3 4 5 6

仍然Target[i] != Pattern[j],且j==0,则跳过Target[i],从Target的下一个字符开始比较。


以上介绍了KMP算法是如何使用神奇的P数组,在O(n)内完成字符串的搜索。下面的内容自然就是如何计算这个P数组,而且也还是在O(n)时间内。不过可能有些绕弯和复杂。
事实上,计算P数组本身只和模式字符串(Pattern)相关,而与目标(Target)字符串无关。因此我们只关注Pattern:ababacb。P数组的正式名称为失效函数(Failure Function),f(j)的定义为,当模式字符串中第j+1个字符(Pattern[j])与目标字符串失配(mismatch)时,模式Pattern中应该由哪个字符(新的j)与刚才失配的字符对齐继续进行比较。对于我们刚才的使用的P数组而言,f(j) = F[j-1]。
f(j)实际上就是要寻找最大k(k<j)使得:

 p0 p1 ... pk-1 pk = pj-k pj-k+1 ... pj-1 pj

似乎看到了模式匹配的影子?的确,这个查找最大k的过程,实质上仍然是一个模式匹配的过程,只是目标和模式现在是同一个串的一部分。
我们使用递推的方式计算数组F(类似DP,但并不满足最优子问题)。设f(j)=F[j-1] = k,则

 p0 p1 ... pk-1 pk = pj-k pj-k+1 ... pj-1 pj

如果pk+1 == pj+1,则f(j+1) = f(j) + 1
如果pk+1 != pj+1,则需要在 p0 p1 … pk-1 pk寻找子串 p0 p1 … ph-1 ph使得

 p0 p1 ... ph-1 ph = pk-h pk-h+1 ... pk-1 pk = pj-h pj-h+1 ... pj-1 pj

如果ph+1 == pj+1,则可知f(j+1) = f(k)+1 = f(f(j)) +1;
如果ph+1 == pj+1,则需要在p0 p1 … ph-1 ph中寻找更小的h,把pj+1给匹配进来。如果死活找不到这个h,则f(j+1)=0,即把j归0位。
继续Pattern=ababacb的例子:

a b a b a c b
0 0 1 ? ? ? ?
0 1 2 3 4 5 6

对于j=3,有f(3) = f(2) + 1 = 2

Pattern: a b a b a c b
F:       0 0 1 2 3 ? ?
j:       0 1 2 3 4 5 6

当j=5时,F[4] == 3,Pattern[5] != Pattern[3],

Pattern: a b a b a c b
F:       0 0 1 2 3 ? ?
j:       0 1 2 3 4 5 6
             a b a b

那就试试f(2)=F[2-1]=1,发现Pattern[5] != Pattern[1]

Pattern: a b a b a c b
F:       0 0 1 2 3 ? ?
j:       0 1 2 3 4 5 6
                 a b a b

因此f(6) = F[5] = 0。
由于P只需要根据Pattern生成一次,所以KMP特别适用于多个Target字符串,单个Pattern串的情况。


下面给出算法的Java实现。我自己写的,可能还有些错误。遗憾的是Java里String.indexOf()方法的实现仍然是用朴素的字符串匹配方法。

	public static int indexOf(String target, String pattern){
		if(pattern.length() == 0){
			return 0;
		}
		int[] fail = getFail(pattern);
		int i=0,j=0;
		while(i < target.length()){
			if(target.charAt(i) == pattern.charAt(j)){
				i++;j++;
			}else if(j == 0){
				i++;
			}else{
				//往回查找j的位置
				j = fail[j-1];
			}
		}
		if(j < pattern.length()){
			return -1;
		}else{
			return i - pattern.length();
		}
	}
	//生成失效函数
	private static int[] getFail(String pattern){
		int[] fail = new int[pattern.length()];
		for(int j=1;j  0){
				k = fail[k];
			}
			if(pattern.charAt(k) == pattern.charAt(j)){
				fail[j] = k + 1;
			}else{
				fail[j] = 0;
			}
		}
		return fail;
	}

foxmail不错

没有公司邮箱的时候盼公司邮箱,有了公司邮箱的时候纠结用什么软件收邮件。总之,我这个人很爱操心,很爱纠结。。大家bs我好了……
一开始用的gmail,考虑到之前一直是用自己gmail的私人邮箱处理公事,用gmail收信不会耽误事情。但是,实践和时间证明,还是会耽误事情,因为该死的gmail延迟20分钟以上,有时候比较着急的邮件刷半天也刷不出来。实在不适合我这种急性子。
第二个选择是office的outlook。一开始装office的时候顺道装上了outlook,可我怎么都觉得outlook难看,又觉得2007版的很占资源,虐待我512的内存,所以,用了半天就抛弃了。
final选择——foxmail。一开始我楞没想到这个软件,今天早上脑袋里突然浮现出了foxmail的红色图标,就上网搜了一个装一下。界面很友好,最最最最关键的是:可以直接把由excel转化成的cvs通讯录导进去!!!超级简单,之前我导入gmail的时候就失败了,以为是excel变来的cvs不能用呢,原来不是啊~~
总结:经过一番折腾,foxmail胜出。

魔都果然是个金钱都市

这么感慨只是因为今天中午去公司对面交通银行开户的时候意识到魔都什么都要收费——在银行办业务,银行要复印你的身份证,居然还要问客户收5毛钱。。真无聊。。。
我现在算是明白为什么很多人在魔都都是月光族,我曾经一度坚信自己是可以存一点钱的,但是现在……我努力的目标是:不月光