如果你只想获取一些面试准备经验,那么你可以直接跳到文章的最后部分。
对于算法面试问题是否有效一直饱受争议。然而,代码编写问题有时候能够很好筛选人才。在我们的例子中:
- 这些问题是“CS101”水平的;
- 我们相信一个优秀的开发者需要能够做出好的决定,并且这种好的决定是基于对有多少个复杂系统在交互的深刻理解上。如果一个开发者不能反转一个字符串,那么他们又怎么可能理解大型客户端面临软件的性能含义?
诚然,参与我们CS02课程的中学生都很聪明(其中一个还是美国计算机奥林匹克对队员)。然而,在对大型软件公司(如微软、亚马逊、谷歌等)的多年采访后,我们发现专业的开发者们并没有比我们的职业顾问人员牛多少。
问题如下:
1. 求从10到100中能被3或5整除的数的和
1
2
3
|
int sum = 0 ; for ( int i = 10 ; i <= 100 ; i++) if ( i % 3 == 0 || i % 5 == 0 ) sum += i; System.out.println(sum); |
2. 将一个字符串逆序,不要使用反转函数
1
2
3
4
|
String message = "he saw a racecar" ; StringBuilder rev = new StringBuilder(); for ( int i = message.length()- 1 ; i >= 0 ; i--) rev.append(message.charAt(i)); System.out.println(rev.toString()); |
3. 反转一个栈
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import java.util.*; public class MyProgram extends com.ktbyte.submit.Coder { public static void main(String[] args) { Stack items = new Stack(); items.push( "he" ); //he is at the bottom of the stack items.push( "saw" ); items.push( "a" ); items.push( "racecar" ); reverseStack(items); //now he is at the top //print in order pushed: while (items.size()> 0 ) System.out.println(items.pop()); } public static void reverseStack(Stack stack) { Queue rev = new LinkedList(); while (stack.size()> 0 ) rev.offer(stack.pop()); while (rev.size()> 0 ) stack.push(rev.poll()); } } |
问题解决的步骤和错误:
1. 解析问题,手工“解决”
- 对于孩子和成年人而言,这一步对前者来说更困难
- 然而,如果要求误解了问题的学生来重读这个问题,孩子们的表现会超过成年人
2. 想出一个伪代码算法
- 在这一步,学生的表现比成年人要好。
- 让人震惊的是,很多成年人不知道如何用他们偏好的编程语言从一个字符串中抽取一个字符。
3. 将算法转换为代码
- 我们有一些C++程序员,他们不知道方括号以及一些C程序员,他们采用指针运算,但是却失败了。
- 更让人吃惊的是,当他们允许查阅java API 文档 或者使用参考书,很多成年人无法找到合适的文档来帮助解决问题。
- 的确,一些中学生已经忘了如何使用栈或者实例化一个队列,但是,所有人都能够在适当的时间内通过查阅找到解决办法。
- 会写代码的成年人(曾经会)经常会超过时间限制。
有很多糟糕的代码编写者,即便你也是其中一个,也别不要害怕
下面的方法并不是为了让求职者参加一个“完整的堆栈训练营”。相反,如果你是一个正在努力和“编程谜题”做斗争的成年人:
1. 不停练习,直到你能快速且正确地写出小的代码片段。没有任何理由用自己喜欢的语言写不出一个双循环。找一些带有例子的小的代码智力题,你能在一分钟以内理解这些问题。对这类问题做成百上千遍的练习(不仅仅是几十遍,切记!)。
2. 为课本上的每个算法写一个用例列表。一个共同的错误就是仅仅记住计算复杂度表。但是看一些算法的使用例子,例如 A*搜索在哪些地方使用,这比学习代码本身要有用的多。
3. 至少做一个能逼迫你使用与工作相关的接口/用例的大型项目。语言通常不是很重要,而且独自写一个大型工程能够强迫你去学新的设计模式以及远离遗留代码维护。代码面试是智利测试。所以它们很少关注具体的体系。
4. 让自己接触更优秀的程序员。随着 CS 岗位的快速增长,应对“柠檬市场”的当前解决办法就是技术面试。但是同样也有其他的方式来反映被面试者的信息。例如,对热点话题、博客、技术的知识可以反映出对重要问题的意识。类似地,对恐怖故事采用幽默的代码书写方式,可以反映出经验和处理新问题的能力。幸运的是,在线代码编写社区随处可见,所以唯一地障碍就是是否肯花时间和保持谦虚。
编注:市场上产品质量等级不同,质量的差异与不确定存在于很多市场,而买卖双方的信息不对称,产品的卖方对产品的质量拥有比买方更多的信息,这种信息不对称情况下的市场可能导致某市场萎缩甚至消失,也就是所谓的柠檬市场。