专栏名称: 伯乐在线
关注职业资讯;学习各类职业感悟、心得和经验分享,扩大职业视野;体会求职、工作和创业的历程 - 就在JobBole.com 伯乐在线
目录
相关文章推荐
程序猿  ·  AI 正在培养“文盲”程序员? ·  昨天  
程序员小灰  ·  跌爆了。。。 ·  2 天前  
程序员的那些事  ·  董事长十几刀刺死 ... ·  昨天  
码农翻身  ·  再这么搞下去,程序员失业是迟早的事! ·  昨天  
OSC开源社区  ·  深度实测Manus,我依然认为这就是AI ... ·  4 天前  
51好读  ›  专栏  ›  伯乐在线

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

伯乐在线  · 公众号  · 程序员  · 2019-11-23 20:40

正文

(给 伯乐在线 加星标,看经典文章

编译:伯乐在线/听风

假想面试的时候用 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 (







请到「今天看啥」查看全文