# 教你几招算法笔试题的套路

# 避实就虚

大家也知道,大部分笔试题目都需要你自己来处理输入数据,然后让程序打印输出。判断的底层原理是,把你的程序的输出用 Linux 重定向符 > 写到文件里面,然后比较你的输出和正确答案是否相同。

那么有的问题难点就变得形同虚设,我们可以偷工减料,举个简单的例子,假设题目给你输入一串空格分隔的字符,告诉你这代表一个单链表,请你吧这个单链表反转,并且强调一定要把输入的数字转换成单链表之后再反转。

那你要怎么做?真就自己定义一个 ListNode 单链表节点类,然后再写代码把输入转化成一个单链表,然后再用让人头晕的指针操作去老老实实反转单链表?

搞清楚我们是来 AC 题目的,不是来学习算法思维的。正确的做法是输入存到数组里,然后用双指针技巧几行代码反转,然后打印出来就完事了。

我就见过不少这种题目,比如题目说输入一个单链表,让我分组反转链表,而且还特别强调用递归实现,如果用数组进行反转几分钟就实现了。

还有扁平化嵌套数组,思路很巧妙,但是笔试中遇到输入一个形如 [1, [4, [6]]] 的字符串,那直接用正则表达式把数字抽出来,就是一个扁平化的列表了。

# 巧用随机数

再说一个鸡贼的技巧,注意那些输出为「二值」的题目,二值就是类似布尔值,或者 0 和 1 这种组合有限的。

比如说很多题目是这样的,巴拉巴拉说一大堆条件,然后问你输入的数据能不能打成这些条件,如果能输出 Yes,否则输出 No。

如果你会做当然最好,不会做怎么办呢?

首先这样提交:

function main(args) {
  console.log('Yes')
}

看一下 case 通过率,假设为 60%,那么说明结果为 Yes 有 60% 的概率,所以可以这样写代码:

function main(args) {
  console.log(Math.random() * 100 < 60 ? "Yes" : "No")
}

# 概率大师

说一个场景,如果笔试出现那种恶心人的单选,四个选项全都没见过,然后你蒙了一个 C。

假设突然你灵光一闪,确定 B 是错的,那么这时候你应该怎么做?

重新在 A 和 D 中间蒙一个啊哥哥!不重新蒙正确的概率为 1/4,重新蒙正确的概率为 3/8,白键的概率都不要吗?

# 编程语言的选择

喜欢啥用啥,考察的是能否做对而不是用啥语言。

# 解法代码分层

代码分层应该算是一种比较好的习惯,可以增加写代码的速度和降低调试的难度,简单说就是不要把所有代码都堆在一起。

# 考前复习策略

考前就别和某一道算法题死磕,不划算。

应该尽可能多地看各种各样的题目,思考五分钟,想不出来解法的话直接看别人的答案。看懂思路就行了,甚至自己写一遍的必要都没有。

笔试的时候最怕就是没有思路,所以把各种题型都过目一下,起码心里不会慌,只要有思路,平均一道题二三十分钟搞定还是不难的。