2016-03-01供稿中心: 北大青鸟武汉中南软件学院
如果你只想获取一些面试准备经验,那么你可以直接跳到文章的后部分。
对于算法面试问题是否有效一直饱受争议。然而,代码编写问题有时候能够很好筛选人才。在我们的例子中:
诚然,参与我们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. 将算法转换为代码
有很多糟糕的代码编写者,即便你也是其中一个,也别不要害怕
下面的方法并不是为了让求职者参加一个“完整的堆栈训练营”。相反,如果你是一个正在努力和“编程谜题”做斗争的成年人:
1. 不停练习,直到你能快速且正确地写出小的代码片段。没有任何理由用自己喜欢的语言写不出一个双循环。找一些带有例子的小的代码智力题,你能在一分钟以内理解这些问题。对这类问题做成百上千遍的练习(不仅仅是几十遍,切记!)。
2. 为课本上的每个算法写一个用例列表。一个共同的错误就是仅仅记住计算复杂度表。但是看一些算法的使用例子,例如 A*搜索在哪些地方使用,这比学习代码本身要有用的多。
3. 至少做一个能逼迫你使用与工作相关的接口/用例的大型项目。语言通常不是很重要,而且独自写一个大型工程能够强迫你去学新的设计模式以及远离遗留代码维护。代码面试是智利测试。所以它们很少关注具体的体系。
4. 让自己接触更优秀的程序员。随着 CS 岗位的快速增长,应对“柠檬市场”的当前解决办法就是技术面试。但是同样也有其他的方式来反映被面试者的信息。例如,对热点话题、博客、技术的知识可以反映出对重要问题的意识。类似地,对恐怖故事采用幽默的代码书写方式,可以反映出经验和处理新问题的能力。幸运的是,在线代码编写社区随处可见,所以唯一地障碍就是是否肯花时间和保持谦虚。