查看原文
其他

留给码农的时间不多了, 这些题都不会, 怎么过海关?[来offer独家习题讲解]

2017-03-06 毕老师 来Offer网

如果你正在找工作,以下文章对你有帮助:

FLAG级别公司OA,却被判作弊?面试, 这5个雷区别踩!

来Offer孙老师专题 | 如何应对2017FLAG校招freeze

来offer独家 | 2017各大公司招聘实况更新, 谷歌新生名额已满!

来offer独家习题讲解 | Next larger number in a sequence

课程 | 为了一个Offer, 你只需要一门课程


二叉查找树(Binary Search Tree, BST) 是一种非常高效而功能强大的的数据结构。它能够高效地以递增的顺序存取元素,且稍加拓展就能够快速回答各种复杂的query。


对于平衡的BST,大多数操作都可以在O(logn)完成。但如果BST不平衡,最坏经常需要O(n)时间,效率大打折扣。


静态构建BST经常会产生不平衡的树,实际应用中经常要保持二叉搜索树平衡以确保操作的效率。最近就有人被问到了如何平衡一个BST:


    要答出二叉查找树才能证明    

“我是软件工程师”   


2月26日,28岁的尼日利亚软件工程师Celestine Omin持短期签证第一次来到美国。在JFK机场入境时,他被海关人员要求回答程序相关题目,证明他确为软件工程师之后才被允许入境。


图片来源:Celestine Omin Twitter


据Omin回忆,他告知海关人员自己是美国科技创业公司Andela的软件工程师,对方询问了他一些问题后,将他带到一个单独房间。他们给了他一张纸,要求他回答纸上的两个问题:

 

1. 设计一个功能,以验证二叉搜索树是否平衡(Write a function to check if a Binary Search Tree is balanced)


2. 什么是抽象类,你为什么需要它?

(What is an abstract class, and why do you need it? )

 

Omin在事后接受LinkedIn采访时表示,他认为海关人员对计算机科学专业并不了解,这些问题就像是“临时从Google上搜‘拿什么问软件工程师’而找来的题目”。


      “回答错误”,一波三折      


由于刚经历了23小时长途飞行,Omin疲惫得难以思考。当他完成作答、将答案交给工作人员时,却被告知他都答错了。


“如果我给的不是Wikipedia上的答案,就会被认为是错误答案吧。”Omin在Twitter上表示。

 

此间Omin试图询问为何海关人员要考这些问题,对方都让他保持安静


图片来源:Celestine Omin Twitter


庆幸的是Omin最后还是被顺利放行,并不是因为他答对了题目,而是海关致电了Omin服务的公司Andela,确认了他软件工程师的身份。

 

Omin回忆,临走时海关人员对他说:“我放你走,但你并没有让我相信你。”


来offer独家习题讲解

祝你过海关一臂之力


这里我们把这个问题严格地定义一下:


写一个函数,输入一个BST,输出一个balanced BST。


一个BST是balanced的当且仅当它是empty的,或者左右子树都是balanced BST且左右子树高度差不超过1。



 方法1 


in-order traverse BST,把元素按递增顺序存入list,再用分治法(divide and conquer)构建平衡二叉树:

时间复杂度分析分两部分:in order traversalbuild tree


in order traversal本质上是一个tree的dfs,复杂度是O(n)。


build tree本质上做了一遍tree traversal,所以是O(n)。


所以时间复杂度是O(n) + O(n) = O(n)。


因为需要一个list存所有的nodes,所以空间复杂度因为O(n)。



把BST变成sorted linked list,TreeNode的right指向next node。然后再把linked list用divide and conquer的方法转换成balance。时间复杂度上我们难以提高,但空间复杂度任然有改进空间。利用tree node中已有的field来存储信息,就可以不利用额外的空间来表示一个sorted list。


 方法2 


ced bst。

// Convert the first n elements of list "head" into a balanced BST.

 // "head" will be set to the head of the rest of the list when this method returns.

上面的代码利用全局变量head和size减少了不必要的参数传递。


时间复杂度的分析和方法1一致。


空间使用主要体现在recursive call的stack frame空间消耗上。recursion的最大深度原树的高度H,要优于O(n)。


时间:O(n)

空间:O(H)



 方法3 


理论上最优的方法是 Day–Stout–Warren algorithm (DSW algorithm) ,可以做到O(n)时间,O(1)空间


DSW algorithm利用tree rotation的技巧,在不破坏BST特性的前提下改变tree的结构。



整个算法分两步:


1.把BST通过反复的right rotation转换成linked list(算法中叫做vine)


2.通过反复的left rotation把linked list转换成balanced BST


时间复杂度分3部分:

treeToVine:每right rotate一次,dummy向右走的链表长度就增加1,所以最多rotate O(n)次


vineSize:O(n)


vineToTree: left rotate n / 2 + n / 4 + n / 8 + …. = O(n)次


总体时间复杂度是O(n)


整个算法iterative方式实现,stack frame的消耗是O(1),且没有额外的创建新object,所以空间复杂度是O(1)。


 平衡二叉搜索树 看似一个简单地问题,然而要做到最优却需要非常巧妙地算法。面试时如能答出方法1或者2就足够过关,而能给出方法3的candidate就能够给面试官留下深刻印象。


无独有偶

    澳码农过关被考Python    


无独有偶,就在Omin遭遇考验前,2月已发生另一起程序员被海关拦下的事件。在欧洲学习的24 岁澳大利亚程序员David Thornton,来到美国度假时在Newark机场被要求解答一系列Python相关问题


“他(海关人员)给我来了个计算机科学测试,不是像在Google做的那种专业级测试,但也是一个不折不扣的考验。” David Thornton后来接受news.com.au访问,回忆起当时的谈话内容:对方先是问了他的停留之间等常规问题,而后开始仔细询问他的职业:


- 你是做什么工作的?

- 我是计算机工程师。

- 你知道Python吗?

- 知道,这是一种编程语言,就像C or Java那样。

- 我有个问题,我想写个计算机程序,你能帮我吗?

- 当然可以。(感到有些吃惊)


Thornton对对方的要求感到有些吃惊,猜测对方可能是在设计耍他。但为了能入境,他还是乖乖同意答题了。


随后海关人员对着电脑开始给Thornton出题,给了他作答的纸笔,还对他的回答不断提出追问。所幸Thornton很快答出一长串问题,得以顺利入境开始假期。


难道他们不允许不合格的软件工程师来美国吗?” Thornto事后打趣道。


      官方表态:恪尽职守      


据BBC报道,一名CBP(海关边境保护局)发言人表示:“对于来到美国的所有人,CBP人员都竭力以尊重相待


“虽然由于隐私权法,我们不能讨论具体个例,但CBP不仅执行移民与海关相关法律,还有其它40多家机构的400多条规定。我们已经阻止了成千上万违反美国法律的人。”


图片来源:路透社



接连发生的两起与入境有关的新闻,不免使外界将此与美国加强入境管控的意图联系起来。Omin来自的尼日利亚并不是特朗普禁止发放签证的7个国家之一,但该国近年来也频受恐怖袭击困扰。


事实上美国、以及西方国家普遍都授予海关或边防警察非常大的权力,对于入境人员进行严格询问与检查,以确保国家安全。


上文提到的Omin被海关带去作答的小房间(也就是久负盛名的“小黑屋”),即CBP的接待室。如果过境人员在窗口遇到问题不能马上解决、需要进一步询问或检查,就会被带到接待室。接待室为工作人员提供接入签证处理系统和FBI系统的查询系统,以调查入境人员是否存在违规、造假等可能威胁国家安全的问题。


尽管美国对于保护公民隐私十分重视,但CBP仍具有广泛的权力,可以对入境人员的行李物品进行全盘检查、甚至进行人身搜查。近期沸沸扬扬的入境学生被查看微信聊天记录事件(见来Offer已推送文章链接),其实该项检查权力也早已被列入CBP的权力范围,即有权搜查电子设备中的内容(Border Search of Electronic Devices Containing Information).


当合格码农

      从容应对入境考验      


码农在海关被要求写代码的事件曝光后,网友们纷纷分享自己在过海关时的奇葩经历,不光是码农们,其他专业的同学也被测试了专业性


@华晨宇要嫁人就嫁给我妹:上次入关那人问我OPT什么工作,我说建筑工程设计,他马上问我你们还在用AutoCAD吗?………我说嗯,有时候也用Revit…………他很满意


GGG不见了:我曾经说自己今后要读研。海关现场给我搜了一道GRE的数学题...我还能说什么 


@王扬王小呆:我入关的时候说自己在法学院,真的问了法律问题…


也有码农未雨绸缪地表示以后海关可能会问dynamic programming的问题了:


图片来源:新浪微博



尽管两位被拦下的程序员最后都顺利入境美国,但还是要提醒大家:


第一,在入境接受询问时要格外谨慎,避免不必要的麻烦。


第二,对自己专业基础不那么自信的同学,为了确保以后能够愉(sao)快(chu)顺(zhang)利(ai)地入境,送上Thornto的一句话共勉:


入境美国之前,一定要好好学习!

Just make sure you study up before you enter the United States!


消息来源


http://www.bbc.co.uk/news/blogs-trending-39127617


http://boingboing.net/2017/03/01/what-is-your-favorite-color.html

 

http://www.news.com.au/travel/travel-advice/travellers-stories/aussies-weird-immigration-interview-in-the-us/news-story/8222c65d2f12e6691ef27c9b1753e821


求职,你只需要一门课程

来Offer 2017年春季班2期

3月20号正式开课



Who We Are

来Offer网 (www.laioffer.com) 由清华大学计算机系在硅谷顶级科技公司(Google, Facebook,Uber)Director & Manager级别校友组成的职业培训机构。成员中有国际信息学奥赛International Olympiad in Informatics (IOI)中国国家队教练,Facebook 最早期的中国工程师经理和中国大陆招聘工程师负责人, 高考省理科状元,Stanford, CMU, Harvard, USC 等校CS Ph.D.组成。


What We Do

用最顶尖的师资力量带出高水平的学生:让强者更强,拿到一线大公司的Offer, 让转专业的同学迅速系统提高,拿到SponsorH1B的正规公司的Offer. 拿Offer不仅仅靠算法,而是系统素质的展现,包括英语表达沟通能力,Coding质量,多线程,System Design, OO Design,以及对美国职场最基本的理解。我们不仅仅是算法培训机构,而是一个培训同学们高成功率拿到Offer的职业培训机构。


  • FLAG 级别 Manager Level班主任负责制,有问题直接语音问答;每班配备10+名主讲老师,精心为同学们课后答疑和 1对1 code review.

  • 独立Online Coding训练系统 code.laioffer.com (300+最新大公司真题只对内部学员开放)

  • Google/Facebook engineer 上机课手把手教你编程

  • 每月一次跟踪考试, 老师1对1修改coding

  • 英文口语/书面的提高

  • 一线大公司Director/Manager level的老师, 内部推荐+面试综合技术提高

  • Internship level 3个月完成的实战project (可选课程)

  • 免费重复听,直到找到工作


高成功率

高成功率是我们唯一的标准: 2013年成立以来我们已经帮助数百名同学拿到Offer,成功率稳定在 80%。 其中Google, Facebook, Uber, Box, Microsoft, Yahoo, Amazon, Indeed, Hulu, IBM 等大中型公司超过半数。真名实姓Offer榜请见www.laioffer.com


欢迎发送简历至info@laioffer.com报名

我们将在24小时内联系您

图片来自网络,版权属于原作者,侵删

本文版权归来offer所有,

未经允许,请勿转载

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存