从面试说起

从面试说起

关于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;
}

这是一道比较简单的面试题,但很多人可能写不出完全正确的答案。这里老师就提出了,几个注意的常见问题:

  1. KMP算法
    • 学过算法或数据结构,大概应该都知道KMP。但是因为它的流程稍微复杂了点,多数人已经记不起来了,要是真的写起来的话时间上也是一个问题。正因为面试官也有可能不太忘记了。
    • 对于面试来说,这块应该是要和面试官沟通一下的。查看对方到底想考察你什么,要是让你热热身就写个简单易懂且完全正确的了,要是想考察你懂不懂KMP那就得认真想想。
  2. 编程风格
    • 代码格式,应该算是代码“素养”方面了。编码中的缩进、变量函数的命名、代码的可读性等等方面……下载个Google_Cpp_Style_guide_CN(C++版)看看吧。其实,可以归结到代码整洁与否的问题。
  3. 边界处理
    • 数组是否越界,有没有做异常检查,用<的时候需要+1或-1,指针使用习惯……等等,这些都是常见的注意点了。

你可能感兴趣的:(GeekBank)