关于算法笔试的几个套路,一点就透
The following article is from labuladong Author labuladong
我知道各位是被标题吸引进来的,那就不废话,先说几个算法笔试的硬核套路,再说说语言选择和做题复习的策略。
避实就虚
大家也知道,大部分笔试题目都需要你自己来处理输入数据,然后让程序打印输出。判题的底层原理是,把你程序的输出用 Linux 重定向符 >
写到文件里面,然后比较你的输出和正确答案是否相同。
那么有的问题难点就变得形同虚设,我们可以偷工减料,举个简化的例子,假设题目说给你输入一串用空格分隔的字符,告诉你这代表一个单链表,请你把这个单链表翻转,并且强调,一定要把输入的数字转化成单链表之后再翻转哦!
那你怎么做?真就自己定义一个 ListNode
单链表节点类,然后再写代码把输入转化成一个单链表,然后再用让人头晕的指针操作去老老实实翻转单链表?
搞清楚我们是来 AC 题目的,不是来学习算法思维的。正确的做法是直接把输入存到数组里,然后用 双指针技巧 几行代码给它翻转了,然后打印出来完事儿。
我就见过不少这种题目,比如题目说输入的是一个单链表,让我分组翻转链表,而且还特别强调要用递归实现,就是我们旧文 K 个一组翻转链表 的算法。嗯,如果用数组进行翻转,两分钟就写出来了,嘿嘿。
还有我们前文 扁平化嵌套列表 讲到的题目,思路很巧妙,但是在笔试中遇到时,输入是一个形如 [1,[4,[6]]]
的字符串,那直接用正则表达式把数字抽出来,就是一个扁平化的列表了……
巧用随机数
再说一个鸡贼的技巧,注意那些输出为「二值」的题目,二值就是类似布尔值,或者 0 和 1 这种组合有限的。
比如说很多题目都类似这样,巴拉巴拉给你说一堆条件,然后问你输入的数据能不能达成这些条件,如果能的话请输出 YES
,不能的话输出 NO
。
如果你会做当然好,如果不会做怎么办?
首先这样提交一下:
public class Main {
public static void main(String[] args) {
System.out.println("YES");
}
}
看下 case 通过率,假设是 60%,那么说明结果为 YES
有 60% 的概率,所以可以这样写代码:
public class Main {
public static void main(String[] args) {
// 60% 的概率输出 YES,40% 的概率输出 NO
System.out.println((new Random().nextInt() % 100) < 60 ? "YES" : "NO");
}
}
多提交几次,整出个 80% 以上的 case 通过不是问题。
嘿嘿,labuladong 说了,这题你可以不会,但是一定要在力所能及的范围内做到极致!
概率大师
编程语言的选择
psvm
和 sout
这样的命令缩写(你要是还不知道命令缩写,赶紧面壁去),而且可以帮你检查出很多笔误,比如说 while
循环里面忘记递增变量,或者 return
语句错写到循环里这种由于疏忽所导致的问题。split
函数都没有,光这点我就不想用 C++ 了……vector
容器,非要用原始的 int[]
数组,我看着都头疼。exec
函数,直接就能算出答案。解法代码分层
main
函数里面,我一直使用的套路是,main
函数负责接收数据,加一个 solution
函数负责统一处理数据和输出答案,然后再用诸如 backtrack
这样一个函数处理具体的算法逻辑。public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 主要负责接收数据
int N = scanner.nextInt();
int[][] orders = new int[N][2];
for (int i = 0; i < N; i++) {
orders[i][0] = scanner.nextInt();
orders[i][1] = scanner.nextInt();
}
// 委托 solution 进行求解
solution(orders);
}
static void solution(int[][] orders) {
// 排除一些基本的边界情况
if (orders.length == 0) {
System.out.println("None");
return;
}
// 委托 dp 函数执行具体的算法逻辑
int res = dp(orders, 0);
// 负责输出结果
System.out.println(res);
}
// 备忘录
static HashMap<String, Integer> memo = new HashMap<>();
static int dp(int[][] orders, int start) {
// 具体的算法逻辑
}
}
private
这种约束免了也无妨,变量用拼音命名也 OK,关键是别把代码直接全写到 main
函数里面,真的乱,不出错也罢,一旦出错,估计要花一番功夫调试了,找不到问题乱了阵脚,那是要尽量避免的。考前复习策略
算法真的没那么难,这一切只是手段而已,过算法笔试拿 offer 才是目的。为了达到目的,套路是必须的,《labuladong的算法小抄》将会为你提供这方面的帮助,可以少走很多弯路!
付东来(@labuladong) 著
GitHub 68.8k star的硬核算法教程
labuladong带你挑战力扣算法题
挑战BAT等大厂Offer
本书专攻算法刷题,训练算法思维,应对算法笔试。注重用套路和框架思维解决问题,以不变应万变。
(扫码了解本书详情)
小编努力为大家争取到了《labuladong的算法小抄》节选版的PDF资料!关注下方公众号,可以免费领取这份宝贵的学习资料,希望可以对大家的学习有一定的帮助!
关注下方公众号,回复:算法
扫描上方二维码关注并回复:算法
就可以获取本书节选版PDF资源
热文推荐