V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shayuvpn0001
V2EX  ›  程序员

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

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

    背景介绍:近期在刷 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   ·   实用小工具   ·   927 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:13 · PVG 05:13 · LAX 13:13 · JFK 16:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.