刷 LeetCode 以及大厂面试做题的一些问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
shayuvpn0001
V2EX    程序员

刷 LeetCode 以及大厂面试做题的一些问题

  shayuvpn0001 2018-06-04 18:47:11 +08:00 4440 次点击
这是一个创建于 2691 天前的主题,其中的信息可能已经有所发展或是发生改变。

背景介绍:近期在刷 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 系列里面说了的,但是真正面试做题的时候时间还是很紧张的,如果有足够的时间进行预先设计,我相信有些代码还是能够更优雅的实现。还有就是我主要是做业务类应用,算法、操作系统和网络这几块忘的比较厉害,是不是也要准备准备啊?希望有面试经验或者大厂在职的来讨论讨论。

10 条回复    2018-07-10 19:55:45 +08:00
xianzixiang
    1
xianzixiang  
   2018-06-04 18:56:29 +08:00 via Android
打算去米国?现在这个形势,米国很难吧
shayuvpn0001
    2
shayuvpn0001  
OP
   2018-06-04 19:07:24 +08:00
@xianzixiang 不一定是美国,加拿大也可以,主要是考虑到下一代。美国确实不好弄了。
Raymon111111
    3
Raymon111111  
   2018-06-04 19:07:45 +08:00   1
优先考虑时间复杂度和空间复杂度
shayuvpn0001
    4
shayuvpn0001  
OP
   2018-06-04 20:34:11 +08:00
@Raymon111111 我也觉得应该这样,毕竟是考察算法本身的。但是如果写的代码不优雅、堆代码速度不快,怕被人笑话啊。在一亩三分地上看到,FLAG 对有几年工作经验的除了靠算法题,还非常看重系统设计能力,当场要你设计一个 xx 系统,感觉还是很具有挑战性的。有几年工作经验的 onsite 的时候一般还会弄个 ppt 展示自己做过的项目。
findingpan
    5
findingpan  
   2018-06-05 02:42:49 +08:00   1
面试时都会给你时间提问的 把你想问的都问出来就可以了 而且白板代码主要讲思路 先把思路讲出来 试官也会说出他的疑问 然后再写代码 面试官不会故意为难你 也会帮你的 反正写不出来就多说 优雅无所谓 快速无所谓 看重过程 但基础还是必须的
lsmgeb89
    6
lsmgeb89  
   2018-06-05 05:09:14 +08:00   1
你想多了,电面就给你 15 分钟做题,要最快速度码完,你还要解释你的 solution。

面试考的是你分析问题的能力,逻辑。

这些工程上的东西,有的话只是锦上添花,不是决定性因素。

(1) 完全不用考虑,想都不用想

(2) const int * myArray 最多了,const int * const myArray 想都不用想。

(3) 分支的话,怎么说,你代码逻辑很清晰就好。

(4) binary tree & binary search tree 优先考虑递归实现,面试官要为难你写 iterative 再写。

(5) 设计模式不是考察重点,有时间可以适当提下,锦上添花。

(6) 标准库最多了,可以用标准库里的函数,例如:lower_bound 这种,但如果面试官要你自己实现一个你也要会写。

什么 gnu,boost 想都不用想

(7) 命名方式注意下
shayuvpn0001
    7
shayuvpn0001  
OP
   2018-06-06 00:51:38 +08:00
@findingpan
@lsmgeb89
好的,谢谢两位解答,特别是 @lsmgeb89 逐个问题回复给了这么纤细的解答。LeetCode 刷多了我觉得也没啥意义,其实类似考试和实际能力一样,能力强的不一定考得好,但是考得好的多半能力都不会差。我觉得花太多时间在 LeetCode 上有点不划算,但是这个东西又是一个绕不过的弯。实际工作中基本上不会用到什么特别复杂的数据结构,用的也是封装好了的库里面的,很多基础库甚至是用汇编来实现的,自己搞出来的效率还没人家的多。唉,反正无论如何先搞几遍再说吧。
Oz2011
    8
Oz2011  
   2018-06-10 13:24:53 +08:00   1
去年刷了一年题 面了 Amazon, Sanpchat 和 FB

( 1 )考察算法和数据结构的时候,需要注意 Generic Programming 么?比如让写一个快速排序,我可以只写一个针对整型的 qsort(int * myArray)的排序,还是需要写一个 qsort<t>(T * myArray)?如果是写后者,那么还要考虑有些类型是否需要定义一个比较的方法。如果只写前者,感觉对于一个有一定工作经验的也不太合适。

---- 个人觉得无所谓,你可以等他说完问题问他输入参数是什么,或者你也可以简单的一句我给个 int 版本的,其他的可以用模板

( 2 )在传入参数的时候,需要考虑尽可能的都加上 const 关键字么?比如找出一个数组中最大的数,写成 int getBiggestNumber(const int * myArray),还是进一步写成 int getBiggestNumber(const int * const myArray)。而且如果参数较多或者使用了指针的指针等情况,就比较复杂了,感觉有点费脑子。同理,还有在写类的时候,如果追求快速实现不讲究设计,可以把成员全部弄成 public,但是这样就不优雅了。

--- 这个真无所谓,人家要的是能工作的程序,你先确保能给个能工作的版本吧

( 3 )需要尽可能合并 if 判断减少 if 判断数量么?还有需要尽可能提出 if...else...中的共同操作语句放到判断外面么?一两层的 if...else...好说,就怕循环嵌套 if 或者多层 if。

--- 没这么多想法,你看看 leetcode 里面有多少有很深的 if else 的,不过能抽出来当然是抽出来的好

( 4 )某个算法同时有递归和循环两种实现,面试的时候优先选递归还是优先选循环?如果希望向面试者展示技术能力,感觉用递归好,但是复杂的递归确实也存在着收敛条件设定容易出错,有撑爆 stack 的潜在风险。

--- 你能搞出哪个搞哪个,递归的想法不是很好吗

( 5 )考察系统设计的时候,是不是要尽可能的往设计模式上面靠(不是说尽可能多的用设计模式,而是斟酌选个更合适的模式)。

--- 设计模式本身就没啥东西啊,和系统设计没关系,最多也就在 OO 题目里让你设计类的时候会用到一点点,设计模式只不过是一些常用方法的总结而已啊

( 6 )如果 C 库或者 C++的 STL 库里面提供了库函数,是否应该尽可能使用这些库函数,以暗示自己对库的熟练掌握。此外,对库的使用是否应该局限在一定范围类,比如只使用 C 标准库,C++的 STL 库,还是尽可能多的用库,比如 C 还有 gnu 的通用库,BSD 的库也非常不错(好多通用函数都是用宏写的,效率高),C++的 Boost 库。 ( 7 )其他小地方比如代码风格、命名方式、初始化参数等。

--- 能用就用,人家给一个算法题不可能直接就一个库函数搞定的,库函数也就实现一个小功能,给你数组排个序,给你提供一些常用数据结构而已。


------------总结一下,楼主不要想太多,题目能做出来,而且是最优的,面试官脑子里那一个这才是最重要的,其他都无所谓。什么 if else const 模板 都不是问题
xianzixiang
    9
xianzixiang  
   2018-06-19 22:03:12 +08:00 via Android
@Oz2011 后来去了哪家
shayuvpn0001
    10
shayuvpn0001  
OP
   2018-07-10 19:55:45 +08:00
@Oz2011 非常感谢~
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2980 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 25ms UTC 13:01 PVG 21:01 LAX 06:01 JFK 09:01
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86