Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
lietoumai opened this issue Aug 27, 2017 · 0 comments
Open

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

lietoumai opened this issue Aug 27, 2017 · 0 comments

Comments

@lietoumai
Copy link
Owner

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

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

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

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

Clojure
1(defn cons [h t] #(if % h t))
“那不是一个链表,那只是一条 if 语句。”面试官说。
“ 这不就是一个另类点的链表吗?”你回答到,同时翻了一个白眼。

Clojure
1 user=> (def x (cons 1 (cons 2 nil)))
2 #'user/x
3 user=> (x true)
4 1
5 user=> ((x false) true)
6 2

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

Clojure
1 user=> x
2 #object[user$cons$cell__4431 0x3b89cc1c "user$cons$cell__4431@3b89cc1c"]

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

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

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

Clojure
1 (defn nth [l n]
2  (when l (if (= 0 n)
3            (l true)
4            (recur (l false) (dec n)))))

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

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

Clojure
1(defn prn-list [l]
2  (print "(")
3  (loop [l l]
4   (if (nil? l)
5      (print ")n")
6      (do (print (l true))
7          (when (l false)
8            (print " "))
9          (recur (l false))))))

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

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

面试官笑了,安心了。 至少此时,代码输出的链表仍是正序的。“那么,要反转这个链表,你需要……”
你抓住了他的手,然后在白板上写代码,那感觉就像在用古老的语言吟诵诗句。而此时此刻,他的大脑却一片混乱,好像松了发条的疯狂乱撞的钟,又仿佛心脏上爬过绦虫,砰砰直跳的心脏恨不得逃出胸腔。

Clojure
1(defn reverse [l]
2  (loop [r nil, l l]
3    (if l
4      (recur (cons (l true) r) (l false))
5      r)))

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

当你松开他的手时,他结结巴巴地说了些有礼貌的话,然后把连帽衫的拉链拉上假装以抵御寒冷。这里将会有其它的面试会议,但你已经不需要参加了。他用锐利的眼光朝你所在的地方看了一眼。
当然,他们会拒绝你,并且总是装着极其难为情地说,你不符合他们的公司文化。乘风归去吧。此地不属于你。

原文出处 https://aphyr.com/posts/340-acing-the-technical-interview

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant