当前位置: 首页 > 科技观察

真正掌握算法的程序员会变得多强?

时间:2023-03-18 18:46:27 科技观察

2020=1024+996……对于程序员来说,2020年看起来并不是很“友好”。但不管外部环境如何,提升自身的内功对于每一个职业者来说都是必须的。在如今的环境下,想要换一份理想的工作,需要“找准时机,把握机会”。当然,面试前的准备是必不可少的。极客大学请来了算法训练营的助教,请他们分享面试官喜欢考察应聘者的哪些能力,有哪些“精选算法面试题”。我们的助教来自美团、百度或海外一线互联网公司。我们希望他们分享的经验能对您有所帮助。作为面试官,前美团高级工程师Windy更看重应聘者的行业背景、专业技能和软素质。具体来说:行业背景就是之前工作所在的领域,比如电商、社交等;专业技能主要是语言基础、高并发、分布式、中间件等知识,以及问题排查、运维、设计能力。这里最看重的是编程能力,架构能力也是考高级的。软素质包括候选人的沟通能力、项目管理能力和领导能力。作为面试官,在面试过程中,我会用笔试题的形式来测试应聘者的思维逻辑能力。具体知识点通常包括链表、树、排序、二分查找等,要求考生能够分析不同算法的时间复杂度。度和空间复杂度。我会在LeetCode上选择简单到中等难度的主题。常见测试的有:单链表翻转(递归或循环)树遍历动态规划(爬楼梯和变形问题,斐波那契数列,股票问题)二分查找(和变形)排序(快速排序)通过算法面试题的考察,希望考生不仅可以展示编程能力,还可以通过对题目的详细理解(如何构建题目的思路)来展示自己的沟通能力和演绎能力。最关键的编程能力,考生可以展示自己在问题边界上的思考,比较不同方法的性能和效率,给出解决问题的多种方法。我选择的算法面试问题是:搜索二维矩阵编写一个有效的算法来确定目标值是否存在于mxn矩阵中。该矩阵具有每行中的整数从左到右按升序排列的属性。每行中的第一个整数大于上一行中的最后一个整数。示例1:输入:matrix=[[1,3,5,7],[10,11,16,20],[23,30,34,50]]target=3输出:true示例2:输入:matrix=[[1,3,5,7],[10,11,16,20],[23,30,34,50]]target=13Output:false百度高级研发工程师Kimze是不同级别的候选人,因为面试官必须专注于某件事。算法训练营的同学很多。对于应届毕业生,我主要考察态度,编程基础,数据结构和算法的基本功。对于有经验的同学,我会结合简历技巧,注重项目经验,考察领域能力的广度和深度,摸清应聘者的上限,相互交流学习。高可用性、高性能和高扩展性是常见的后端技术。针对不同的技术栈,我会考察:分布式分层架构设计理解LB负载均衡,前端压缩/CDN缓存/DNS相关知识多级缓存,MQ异步解耦无状态设计->DBSharding的快速扩缩容,读写分离、分库分表、SQL和慢查询优化、JVM优化等措施ES检索、数据异构、大数据处理一致性设计:批异步、串转并行、同步转异步数据协议、通信协议容量预估规划、全链路压测、灰度发布设计、降级/熔断/限流设计、RPC服务治理分布式配置、注册、监控CI/CD:“Docker+Kubernetes”架构考察数据结构和算法,比较基础快速排序、合并和二进制搜索等主题。考生必须能够分析时间和空间的复杂性,并演示相关的推导过程。更高级的内容,我的最低要求是有思路,知道什么情况下用什么数据结构和算法,写个模板就行。比如我会问:Redis底层数据结构设计,skiptable的原理是扩展,然后扩展到Hash和扩展的实现。希望考查考生是否了解skiptable的优缺点,Redis为什么要这样设计。MySQLB+树索引结构的时间复杂度和选择的原因,希望研究一下为什么用B+树而不是红黑树或者Hash,跳表。我调查的具体主题不多。我觉得一个很好的题目是:用给定的硬币和总金额兑换不同面额的硬币。编写一个函数来计算最少需要多少个硬币来弥补总量。如果没有硬币组合构成总数,则返回-1。示例1:输入:coins=[1,2,5],amount=11输出:3解释:11=5+5+1示例2:输入:coins=[2],amount=3输出:-1解释:您可以认为每个硬币的数量是无限的。Serko高级软件工程师许不同的公司、不同的岗位、不同的层次,需要的能力、范围、深度都不一样。海外公司和国内互联网公司的业务需求也有很大差异,但我认为作为一名程序员,一般需要具备以下能力:编程能力(编码、数据结构与算法、数学)干净的代码(Cleancode)良好的编程实践(Goodprogrammingpractices)软件设计系统设计软件架构系统架构分析和解决问题的能力领导沟通能力合作能力分享能力持续学习能力针对大部分需要面试的初级和中级程序员,作为第一轮白板技术面的算法题,我一般会在LeetCode上从easy到meduim提问。这些问题一般都可以暴力解决,可以优化。各种解决方案和想法,应聘者最好能展示出一定的软件工程实力。在做题的过程中,有几点需要注意:看懂题目,在这个过程中和面试官沟通,明确题目要求和相关问题,而不是一开始就开始写程序你上来设计算法,过程中不断与面试官互动,一步步探索最优解,而不是一个人“努力”不说话。实施算法,展示您对过程中软件开发和测试的理解。代码完成后,可以酌情和面试官讨论一些相关的东西,比如TDD、BDD、CI/CD等。算法面试题我挑的是:VerifyingaBinarySearchTreeGivenabinarytree,determinewhether它是一个有效的二叉搜索树。假设一棵二叉搜索树具有以下特点:节点的左子树只包含小于当前节点的数字。节点的右子树仅包含大于当前节点的数字。所有的左子树和右子树本身必须是二叉搜索树。示例1:输入:2/\13输出:true示例2:输入:5/\14/\36输出:false解释:输入为:[5,1,4,null,null,3,6]。根节点的值为5,但其右子节点的值为4。以上问题你能做吗?什么?你不能?不用担心,就像其他编程技能一样,你可以高效掌握常用算法和数据结构的知识,并学会使用相应的算法解决实际工作和面试中的问题。算法问题可以通过学习和训练不断改进。