Level 1: 写出核心函数
有些公司的面试官在进行算法面试时只要求你写出实现这个算法的核心函数,其他头文件, main()函数等不要求写。这种形式的代码面试难度最低,只要写出函数就行了,而且面试官看的时候也只是看看大致思路。
我在笔试的时候遇到过这样的题,记得是一道二叉树的题,让你求最大宽度,然后答题区是一个文本框(不能调试运行)
LeetCode上的题都是只要求你写个函数接口API
Level 2:写出完整程序
很多时候,我们面试时,不会遇到像LeetCode这样只让你专心写函数的平台,所以80%的情况是:面试官出一个题目,然后让你在一个他们提供的平台上(类似IDE,但一般不会有代码提示功能)写出解决这个问题的完整程序,也就是要包括#include <iostream> int main ...
,而且你需要自己给测试用例,然后把结果跑出来给面试官看
这种形式其是我们平时做OJ的形式,所以也还好,只不过遇到二叉树的问题,需要自己建立一棵二叉树Binary Tree,代码会有点长。所以如果平时习惯于在LeetCode上写面试题,一定要训练一下怎么写出完整的程序
例如:LeetCode 1367. 二叉树中的列表 这个题我在IDE上写出了完整的程序
常用模版
// 情况一
// create an array
// 5
// 1 2 3 2 2
vector<int> arr;
int n, d;
cin >> n;
while (n-- && cin >> d) {
arr.push_back(d);
}
// 情况二
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x)
: val(x)
, left(NULL)
, right(NULL) {
}
};
// create tree by preorder, -1 means NULL
TreeNode *createTree() {
int d;
cin >> d;
if (d == -1) return NULL;
TreeNode *root = new TreeNode(d);
root->left = createTree();
root->right = createTree();
return root;
}
// 情况三
struct ListNode {
int val;
ListNode *next;
ListNode(int x)
: val(x)
, next(NULL) {
}
};
// create linked list, -1 means NULL
ListNode *createList() {
int d;
cin >> d;
if (d == -1) return NULL;
ListNode *head = new ListNode(d);
head->next = createList();
return head;
}
Level 3:白板手写代码
这种形式是最难的,一般大厂(如Google、字节跳动、阿里巴巴等)会要求在白板上手写代码
这里所说的白板可能是一个记事本、Word文档,也可能是在现场给你一块白板、一张A4纸,让你用笔把算法框架及代码写给面试官看
相比起传统的编程环境,白板面试会迫使你在没有自己喜欢的工具的情况下、在不熟悉的环境中写代码。这就可能导致你在紧张的面试过程中容易犯错误,而你在一个陌生的环境中遇见问题时的处理方式和思维方式,也将会成为公司考量你的标准之一
白板面试可以有效地考察面试者的综合素质,面试官一般关注更多的是:你遇到一个新问题的思考能力;你与别人的沟通能力;你遇到挫折时候的应变能力;你接受到任务时的反馈能力;你的思路是否清晰,代码结构是否层次分明;你的代码可读性、可维护性等
白板面试训练方法
手撕算法步骤:
- 拿到题目,跟面试官确认题目意思,避免偏题;问清要求,如时间复杂度是多少,是否可以用辅助空间
- 思考后,写好算法思路框架,并与面试官沟通交流
- 声明函数,在注释写自己的思路
- 判断非法输入、边界等
- 正式解题,关键步骤要注释
- 写好测试用例
- 测试写好的程序,运行给面试官看
很多时候,你会发现一合上电脑,让你在纸上写这个算法时,你可能一头雾水,因为你习惯了有对齐的代码框架,有代码提示
多在白板或白纸上写代码,这对你的编程能力会有很大的提高,而且有利于训练你的思维方式,提高对编程词汇的记忆,加深你对整个题目的理解和思路的记忆