反转技术面试!还有这样的操作?

2017 年 7 月 20 日 伯乐在线 伯乐在线

(点击上方公众号,可快速关注)


编译:伯乐在线/听风 

如有好文章投稿,请点击 → 这里了解详情


假想面试的时候用 Clojure 做题,狠狠地鄙视了一下不懂 Clojure、且高傲无知的面试官,然后潇洒地离去。


如果你打算找一份程序员的工作,那么你必须要通过白板面试。 作为工程师,模拟白板面试也经常是我们早上例行公事的一部分,同时还需要在星光层(astral plane)上打开一个漂亮的网格状的 xterms 窗口,并且在每个邻近的目录中不由自主地运行 ls 命令,以防事情在昨晚有什么变化。


这不亚于在厨房后面的那个抽屉里,搞一次天翻地覆地搜查。而那个抽屉里存放着各种各样的法兰盘、螺丝刀和从各种家用电器上掉下来多年的各种配饰或零件。现在谁也不知道这些东西原来是做什么用的,或许从来就没知道过,尽管如此,我们还必须小心翼翼的对待它们。


下面我将通过一个常见的面试题,向你演示一下白板面试:反转链表。


首先,我们需要一个链表。清除 xterms 中不需要的工作区,然后在两个括号的作用域中写上必要的元素和通配符。这样我们就从无到有创建出了一个链表。


(defn cons [h t] #(if % h t))


“那不是一个链表,那只是一条 if 语句。”面试官说。


“ 这不就是一个另类点的链表吗?”你回答到,同时翻了一个白眼。



user=> (def x (cons 1 (cons 2 nil)))

#'user/x

user=> (x true)

1

user=> ((x false) true)

2


“x 到底是什么?”面试官尽量让自己看些来友善些。答案就在 REPL,但不要被它一时误导了,它们可不是你的朋友。你在前台的“誓言”,不允许你使用它。


user=> x

#object[user$cons$cell__4431 0x3b89cc1c "user$cons$cell__4431@3b89cc1c"]


“了解一个事物最好的方式,就是对它命名。”你回答到。恰当的名字具备魔力。由 Ursula K. Le Guin 发明的 K 语言是最古老和最精练的形式语言之一。一旦你使用某个字符对程序进行自定义命名,意味着你将不能再使用这个字符元素。 你自定义的缩写名称会记录在程序的内存中。


“呃,好吧,你怎么从这个链表里面取出一个元素呢?” 面试官又问。



那些巧妙的表达式在你脑海中逐一呈现,仿佛红地毯在你光着的双脚下慢慢展开; 犹如昨晚观看奥斯卡颁奖典礼时,你憧憬着不同的明星来亲吻你;又好像你住在瑟略岛(Sørøya )山脉之上,月亮就是你的爱人。 除了边界检查,你在第一时间写出了正确的代码:


(defn nth [l n]

  (when l (if (= 0 n)

            (l true)

            (recur (l false) (dec n)))))


“你能不能给我写一个正常的链表吗?就像 Python 中的那样?”


你咬紧牙关,气愤地在地板上直跺脚,但还是写了一个排版良好的打印函数。 此刻,你的手掌仿佛充满了老茧,你的眼皮仿佛沾满了冰霜、以及烟灰黑色的雪花。 每个函数都是要付出代价的,当然,除非它是无副作用的纯函数。



(defn prn-list [l]

  (print "(")

  (loop [l l]

    (if (nil? l)

      (print ")n")

      (do (print (l true))

          (when (l false)

            (print " "))

          (recur (l false))))))


白板面试时根本没有多余的时间去描述变量、写示例或文档注释。在白板面试中,时间就是一切。你就假装你是一名 Haskell 程序员,正当着你奶奶的面继续完成下面的代码。


user=> (prn-list (cons 1 (cons 2 (cons 3 nil))))

(1 2 3)


面试官笑了,安心了。 至少此时,代码输出的链表仍是正序的。“那么,要反转这个链表,你需要……”


你抓住了他的手,然后在白板上写代码,那感觉就像在用古老的语言吟诵诗句。而此时此刻,他的大脑却一片混乱,好像松了发条的疯狂乱撞的钟,又仿佛心脏上爬过绦虫,砰砰直跳的心脏恨不得逃出胸腔。


(defn reverse [l]

  (loop [r nil, l l]

    (if l

      (recur (cons (l true) r) (l false))

      r)))

 

user=> (prn-list (reverse (cons 1 (cons 2 (cons 3 nil)))))

(3 2 1)


当你松开他的手时,他结结巴巴地说了些有礼貌的话,然后把连帽衫的拉链拉上假装以抵御寒冷。这里将会有其它的面试会议,但你已经不需要参加了。他用锐利的眼光朝你所在的地方看了一眼。


当然,他们会拒绝你,并且总是装着极其难为情地说,你不符合他们的公司文化。乘风归去吧。此地不属于你。



看完本文有收获?请分享给更多人

关注「伯乐在线」,看更多精选 IT 职场文章

登录查看更多
0

相关内容

Clojure 是一套现代的 Lisp 语言的动态语言版,它可以执行于 Java 虚拟机器(JVM)之上。 官网 clojure.org/
中文论坛 http://clojure-china.org/
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【2020新书】从Excel中学习数据挖掘,223页pdf
专知会员服务
90+阅读 · 2020年6月28日
还在修改博士论文?这份《博士论文写作技巧》为你指南
打怪升级!2020机器学习工程师技术路线图
专知会员服务
98+阅读 · 2020年6月3日
【经典书】Python计算机视觉编程,中文版,363页pdf
专知会员服务
139+阅读 · 2020年2月16日
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
面试题:文本摘要中的NLP技术
七月在线实验室
15+阅读 · 2019年5月13日
深度学习面试100题(第71-75题)
七月在线实验室
5+阅读 · 2018年8月2日
已删除
生物探索
3+阅读 · 2018年2月10日
机器学习面试 | 这些题目一定会被问到
七月在线实验室
5+阅读 · 2017年12月10日
十五条有用的Golang编程经验
CSDN大数据
5+阅读 · 2017年8月7日
代码这样写不止于优雅(Python版)
数说工作室
4+阅读 · 2017年7月17日
Arxiv
5+阅读 · 2019年4月21日
Arxiv
4+阅读 · 2018年10月31日
Arxiv
23+阅读 · 2017年3月9日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【2020新书】从Excel中学习数据挖掘,223页pdf
专知会员服务
90+阅读 · 2020年6月28日
还在修改博士论文?这份《博士论文写作技巧》为你指南
打怪升级!2020机器学习工程师技术路线图
专知会员服务
98+阅读 · 2020年6月3日
【经典书】Python计算机视觉编程,中文版,363页pdf
专知会员服务
139+阅读 · 2020年2月16日
相关资讯
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
面试题:文本摘要中的NLP技术
七月在线实验室
15+阅读 · 2019年5月13日
深度学习面试100题(第71-75题)
七月在线实验室
5+阅读 · 2018年8月2日
已删除
生物探索
3+阅读 · 2018年2月10日
机器学习面试 | 这些题目一定会被问到
七月在线实验室
5+阅读 · 2017年12月10日
十五条有用的Golang编程经验
CSDN大数据
5+阅读 · 2017年8月7日
代码这样写不止于优雅(Python版)
数说工作室
4+阅读 · 2017年7月17日
Top
微信扫码咨询专知VIP会员