关于GeekBand的算法课程,我感觉董飞老师讲得还是不错的。虽然这门课的核心也是算法,但董老师是从面试的角度切入,这里我就觉得很nice了。因为如果是教你算法的核心内容,完全可以去网上找些很经典的课程或是书籍–比如《算法(第四版)》红宝书 + cousera的Algorithm Part I & II,《算法导论》 + 也有相关视频–那里面可以讲得更细腻,思路应该也更清晰,而董老师从面试的角度进行讲解,应该很好不补充了。
在面试中的常见误区董老师就提到3点:1.做过的题肯定能过。2.算法想出来了就能过。3.代码写出了就能过。
这个问题真的是很实在,因为缺少实践能力的人,真的太多了。拿数据结构这门课来说,有多少人用代码实现过树、图章节的内容?大部分人(包括我)都感觉明白什么是Dijkstra算法而已,叫你代码敲起来就挂了。所以说,你能想到的真不一定能实现出来。
其实,代码也算是个手艺活,得多练多写,还要多总结。久了生疏了,对于一些问题没有理解到本质,往往就会出问题。不能举一反三解决类型题、没有总结过的知识,都应该是很难说已经掌握了。
再说说面试吧。如果一个人的能力能像游戏中的血条一样被直接看见,那么就不必面试了。之所以面试也正是因为面试官们不清楚求职者的能力。通过面试,来了解求职者的能力,之后再邀请某些求职者成为自己的同事。自然的,在面试官眼中,求职者可能就是他们未来的同事了,那么应该不存在故意为难的说法了。
从这个角度看,面试官在意的地方可能就有如下几点了:
- 你的代码看起来舒服么?——Ta需要多少时间Review你的代码。
- 你的编码习惯好么?——Ta不会再未来疲于帮你Debug,你不会经常就搞出事故吧。
- 你的沟通能力好么?——Ta和你交流费劲么。
从strstr()这道面试题为例,开始吧。这是一道热身题,看起来是比较简单,但从中看看我们一般可以会犯什么错误。或者说我们站在面试官的角度,注意哪些要点。
题目:strstr() 是搜索一个字符串在另一个字符串中的第一次出现。找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址;如果未找到所搜索的字符串,则返回-1。
答案:
int strstr( const string source, const string target)
{
if (source == "" || target == "")
{
return -1;
}
for (int i = 0; i < source.length() - target.length() + 1; i++)
{
int j;
for (j = 0; j < target.length(); j++)
{
if ( source[i + j] != target[j])
break;
}
if (j == target.length())
{
return 1;
}
}
return -1;
}
这是一道比较简单的面试题,但很多人可能写不出完全正确的答案。这里老师就提出了,几个注意的常见问题: