背景介绍:近期在刷 LeetCode 准备面试,想走技术移民路线。国内 985 硕士,工作是面向项目的开发,所以用的语言比较杂:C 做 Linux 的应用,C#做桌面客户端,PHP 做 web 相关工作,Python 做爬虫和测试相关工作。
核心问题是:一般公司(特别是北美的公司)在线编程面试的时候,面试者是尽可能的快速完成比较好,还是尽可能以优雅的方式来完成代码比较好?
具体表现在以下几个方面:
( 1 )考察算法和数据结构的时候,需要注意 Generic Programming 么?比如让写一个快速排序,我可以只写一个针对整型的 qsort(int * myArray)的排序,还是需要写一个 qsort<t>(T * myArray)?如果是写后者,那么还要考虑有些类型是否需要定义一个比较的方法。如果只写前者,感觉对于一个有一定工作经验的也不太合适。
( 2 )在传入参数的时候,需要考虑尽可能的都加上 const 关键字么?比如找出一个数组中最大的数,写成 int getBiggestNumber(const int * myArray),还是进一步写成 int getBiggestNumber(const int * const myArray)。而且如果参数较多或者使用了指针的指针等情况,就比较复杂了,感觉有点费脑子。同理,还有在写类的时候,如果追求快速实现不讲究设计,可以把成员全部弄成 public,但是这样就不优雅了。
( 3 )需要尽可能合并 if 判断减少 if 判断数量么?还有需要尽可能提出 if...else...中的共同操作语句放到判断外面么?一两层的 if...else...好说,就怕循环嵌套 if 或者多层 if。
( 4 )某个算法同时有递归和循环两种实现,面试的时候优先选递归还是优先选循环?如果希望向面试者展示技术能力,感觉用递归好,但是复杂的递归确实也存在着收敛条件设定容易出错,有撑爆 stack 的潜在风险。
( 5 )考察系统设计的时候,是不是要尽可能的往设计模式上面靠(不是说尽可能多的用设计模式,而是斟酌选个更合适的模式)。
( 6 )如果 C 库或者 C++的 STL 库里面提供了库函数,是否应该尽可能使用这些库函数,以暗示自己对库的熟练掌握。此外,对库的使用是否应该局限在一定范围类,比如只使用 C 标准库,C++的 STL 库,还是尽可能多的用库,比如 C 还有 gnu 的通用库,BSD 的库也非常不错(好多通用函数都是用宏写的,效率高),C++的 Boost 库。 ( 7 )其他小地方比如代码风格、命名方式、初始化参数等。
我知道上面有些内容是 effective 系列里面说了的,但是真正面试做题的时候时间还是很紧张的,如果有足够的时间进行预先设计,我相信有些代码还是能够更优雅的实现。还有就是我主要是做业务类应用,算法、操作系统和网络这几块忘的比较厉害,是不是也要准备准备啊?希望有面试经验或者大厂在职的来讨论讨论。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.