Ⅰ 大公司笔试面试有哪些经典算法题目
1、二维数组中的查找
具体例题:如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。现在给出一个数字序列,允许使用一种转换操作:选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列?
Ⅱ 算法面试
我在《再谈“我是怎么招程序员”》中比较保守地说过,“问难的算法题并没有错,错的很多面试官只是在肤浅甚至错误地理解着面试算法题的目的。”,今天,我想加强一下这个观点——我反对纯算法题面试!(注意,我说的是纯算法题)图片源Wikipedia(点击图片查看词条)我再次引用我以前的一个观点——能解算法题并不意味着这个人就有能力就能在工作中解决问题,你可以想想,小学奥数题可能比这些题更难,但并不意味着那些奥数能手就能解决实际问题。好了,让我们来看一个示例(这个示例是昨天在微博上的一个讨论),这个题是——“找出无序数组中第2大的数”,几乎所有的人都用了O(n)的算法,我相信对于我们这些应试教育出来的人来说,不用排序用O(n)算法是很正常的事,连我都不由自主地认为O(n)算法是这个题的标准答案。我们太习惯于标准答案了,这是我国教育最悲哀的地方。(广义的洗脑就是让你的意识依赖于某个标准答案,然后通过给你标准答案让你不会思考而控制你)功能性需求分析试想,如果我们在实际工作中得到这样一个题 我们会怎么做?我一定会分析这个需求,因为我害怕需求未来会改变,今天你叫我找一个第2大的数,明天你找我找一个第4大的数,后天叫我找一个第100大的数,我不搞死了。需求变化是很正常的事。分析完这个需求后,我会很自然地去写找第K大数的算法——难度一下子就增大了。很多人会以为找第K大的需求是一种“过早扩展”的思路,不是这样的,我相信我们在实际编码中写过太多这样的程序了,你一定不会设计出这样的函数接口 —— Find2ndMaxNum(int* array, int len),就好像你不会设计出 DestroyBaghdad(); 这样的接口,而是设计一个DestoryCity( City& ); 的接口,而把Baghdad当成参数传进去!所以,你应该是声明一个叫FindKthMaxNum(int* array, int len, int kth),把2当成参数传进去。这是最基本的编程方法,用数学的话来说,叫代数!最简单的需求分析方法就是把需求翻译成函数名,然后看看是这个接口不是很二?!(注:不要纠结于FindMaxNum()或FindMinNum(),因为这两个函数名的业务意义很清楚了,不像Find2ndMaxNum()那么二)非功能性需求分析性能之类的东西从来都是非功能性需求,对于算法题,我们太喜欢研究算法题的空间和时间复杂度了。我们希望做到空间和时间双丰收,这是算法学术界的风格。所以,习惯于标准答案的我们已经失去思考的能力,只会机械地思考算法之内的性能,而忽略了算法之外的性能。如果题目是——“从无序数组中找到第K个最大的数”,那么,我们一定会去思考用O(n)的线性算法找出第K个数。事实上,也有线性算法——STL中可以用nth_element求得类似的第n大的数,其利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:1)Sa中元素的个数小于k,则Sb中的第 k-|Sa|个元素即为第k大数;2) Sa中元素的个数大于等于k,则返回Sa中的第k大数。时间复杂度近似为O(n)。搞学术的nuts们到了这一步一定会欢呼胜利!但是他们哪里能想得到性能的需求分析也是来源自业务的!我们一说性能,基本上是个人都会问,请求量有多大?如果我们的FindKthMaxNum()的请求量是m次,那么你的这个每次都要O(n)复杂度的算法得到的效果就是O(n*m),这一点,是书呆子式的学院派人永远想不到的。因为应试教育让我们不会从实际思考了。工程式的解法根据上面的需求分析,有软件工程经验的人的解法通常会这样:1)把数组排序,从大到小。2)于是你要第k大的数,就直接访问 array[k]。排序只需要一次,O(n*log(n)),然后,接下来的m次对FindKthMaxNum()的调用全是O(1)的,整体复杂度反而成了线性的。其实,上述的还不是工程式的最好的解法,因为,在业务中,那数组中的数据可能会是会变化的,所以,如果是用数组排序的话,有数据的改动会让我重新排序,这个太耗性能了,如果实际情况中会有很多的插入或删除操作,那么可以考虑使用B+树。工程式的解法有以下特点:1)很方便扩展,因为数据排好序了,你还可以方便地支持各种需求,如从第k1大到k2大的数据(那些学院派写出来的代码在拿到这个需求时又开始挠头苦想了)2)规整的数据会简化整体的算法复杂度,从而整体性能会更好。(公欲善其事,必先利其器)3)代码变得清晰,易懂,易维护!(学院派的和STL一样的近似O(n)复杂度的算法没人敢动)争论你可能会和我有以下争论,如果程序员做这个算法题用排序的方式,他一定不会像你想那么多。是的,你说得对。但是我想说,很多时候,我们直觉地思考,恰恰是正确的路。因为“排序”这个思路符合人类大脑处理问题的方式,而使用学院派的方式是反大脑直觉的。反大脑直觉的,通常意味着晦涩难懂,维护成本上升。就是一道面试题,我就是想测试一下你的算法技能,这也扯太多了。没问题,不过,我们要清楚我们是在招什么人?是一个只会写算法的人,还是一个会做软件的人?这个只有你自己最清楚。这个算法题太容易诱导到学院派的思路了。是的这道“找出第K大的数”,其实可以变换为更为业务一点的题目——“我要和别的商户竞价,我想排在所有竞争对手报价的第K名,请写一个程序,我输入K,和一个商品名,系统告诉我应该订多少价?(商家的所有商品的报价在一数组中)”——业务分析,整体性能,算法,数据结构,增加需求让应聘者重构,这一个问题就全考了。你是不是在说算法不重要,不用学?千万别这样理解我,搞得好像如果面试不面,我就可以不学。算法很重要,算法题能锻炼我们的思维,而且也有很多实际用处。我这篇文章不是让大家不要去学算法,这是完全错误的,我是让大家带着业务问题去使用算法。问你业务问题,一样会问到算法题上来。小结看过这上面的分析,我相信你明白我为什么反对纯算法面试题了。原因就是纯算法的面试题根本不能反应一个程序的综合素质!那么,在面试中,我们应该要考量程序员的那些综合素质呢?我以为有下面这些东西:会不会做需求分析?怎么理解问题的?解决问题的思路是什么?想法如何?会不会对基础的算法和数据结构灵活运用?另外,我们知道,对于软件开发来说,在工程上,难是的下面是这些挑战:软件的维护成本远远大于软件的开发成本。软件的质量变得越来越重要,所以,测试工作也变得越来越重要。软件的需求总是在变的,软件的需求总是一点一点往上加的。程序中大量的代码都是在处理一些错误的或是不正常的流程。所以,对于编程能力上,我们应该主要考量程序员的如下能力:设计是否满足对需求的理解,并可以应对可能出现的需求变化。
Ⅲ 面试最常考的 100 道算法题分类整理
大家好,我是 “负雪明早冲烛” ,一位用 7 年写槐毁了 1000 篇 LeetCode 算法题题解的程序员。欢迎关注。
粉丝常说: LeetCode 算法题太多了,准备面试该刷哪些题目 ?
我之前根据 LeetCode 上面的点赞量分享过: LeetCode 上最经典的 100 道算法题 。
这 100 道题目都属于经典题目了,面试也常考,不过我还是不放心呢,毕竟 经典题 ≠ 面试题 呀!
但如果想知道面试常考的 100 道算法题的话,需要至少整理 1000 篇面经吧?这个工作量可不小啊!
还好,网上有个开源项目,帮我们做了这件事情,这个项目就是 CodeTop !
这是网站的界面(地址: https://codetop.cc/home ),展示的就是每个面试题目出现的频度情况,甚至区分了公司和岗位:
这是开源项目的 GitHub 主页,已经 11.5k star ⭐️ 了:
这个项目中的题目来源是牛客网的面经、网友投票等,而且持续更新中,所以还是比较可靠的。
我对这个项目做了陆明歼整理,分类整理出来面试常考的 100 道算法题。
在整理之后,我对结果还是有点 惊讶 的!因为一些常见的数据结构与算法,竟然没有在常考面试中出现过!
比如前缀和、前缀树、并查集、图,这些都没有出现……
最常考面试题还是很基本的链表、二叉树、动态规划等等,是不是符合你的认知呢?
强烈建议大家在面试前把这 100 道题目搞懂!
作为宠粉达人,我提供了 3 种方式查看这 100 道题目:
没有任何套路,直接分享给大家!
在线查看地址: https://www.mubucm.com/doc/7jiBYKCKqet
在线查看地址: https://leetcode-cn.com/problem-list/q3iOID0B/
所有题目的地址如下:
前序遍历
中序遍历
层序遍历
视图
如果你觉得对你有帮助的话,求赞、求分享、求收藏。你的每一点鼓励都是对我的最大帮助!
Ⅳ 大厂面试算法是通过提问的方式还是通过笔试的方式
大家好,我是Severus,一个在某厂做中文文本理解的程序员。同时,也感谢小轶与我一同讨论和梳理本文的内容。
2021年的秋季招聘已经过去了,大概是从着名的“拥抱变化”开始,每一年的秋季招聘,都能看到知乎里面的阵阵哀嚎,比如,2020年算法岗一片红海,2021年算法岗灰飞烟灭,2022年算法岗人间地狱……。算法岗招聘标准看上稿谨去水涨船高,“内卷”这个词用在纯薯近几年的校园招聘上再合适不做敬者过。
我浏览各个技术公众号,或者技术交流平台,也是充斥着各种各样的面经、秋招指南等等。我深感其中存在许多观点很是有误人子弟的可能性。大概是由于这些文章多来源于当年刚刚斩获 offer 的毕业生,以至于这些经验也只是站在作者个人的面试经历来说,普适性很低。另外,应试者自身可能也并不清楚自己秋招成功,为面试官所赏识的关键点是什么,因而 ta 所分享的秋招攻略可能也颇具误导性。
那今天,我作为一个工作了6年,同时也是一个有相当经验的面试官,乘着现在的 offer 已经该发都发了,来分享一下我 从一个面试官的角度,是怎么看待算法岗求职的 。当然,以下的面试风格,有我非常浓厚的个人印记。我的工作,兼有基础算法研发、前沿探索以及部分工程、落地应用开发,所以自有我的面试要求及职业发展规划,但我也敢说,搞得定我,就能搞得定大部分一二面面试官。
这篇文章将围绕以下几个问题展开。前两个问题其实是我关于算法岗求职的一些概括性的观点,后面三个问题会涉及具体的面试细节。
Ⅳ 数据结构面试常见问题
数据结构面试常见问题
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。下面就是我整理的数据结构面试常见问题,一起来看一下吧。
数据结构与算法,这个部分的内容其实是十分的庞大,要想都覆盖到不太容易。在校学习阶段我们可能需要对每种结构,每种算法都学习,但是找工作笔试或者面试的燃银坦时候,要在很短的时间内考察一个人这方面的能力,把每种结构和算法都问一遍不太现实。所以,实际的情况是,企业一般考察一些看起来很基本的概念和算法,或者是一些变形,然后让你去实现。搏弯也许看起来简单,但是如果真让你在纸上或者是计算机上快速地完成一个算法,并且设计测试案例,最后跑起来,你就会发现会很难了。这就要求我们要熟悉,并牢固掌握常用的算法,特别是那些看起来貌似简单的算法,正是这些用起来很普遍的算法,才要求我们能很扎实的掌握,在实际工作中提高工作效率。遇到复杂的算法,通过分析和扎实的基本功,应该可以很快地进行开发。
闲话少说,下面进入正题。
一.数据结构部分
1.数组和链表的区别。(很简单,但是很常考,记得要回答全面)
C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小。而在实际应用中,用户使用数组之前有时无法准确确定数组的大小,只能将数组定义成足够大小,这样数组中有些空间可能不被使用,从而造成内存空间的浪费。链表是一种常见的数据组织形式,它采用动态分配内存的形式实现。需要时可以用new分配内存空间,不需要时用将已分配的空间释放,不会造成内存空间的浪费。
从逻辑结构来看:数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况,即数组的大小一旦定义就不能改变。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;链表动态地进行存储分配,可以适应数据动态地增减的.情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)。
从内存存储来看:(静态)数组从栈中分配空间(用NEW创建的在堆中), 对于程序员方便快速,但是自由度小;链表从堆中分配空间, 自由度大但是申请管理比较麻烦.
1.从访问方式来看:数组在内存中是连续存储的,因此,可以利用下标索引进行随机访问;链表是链式存储结构,在访问元素的时候只能通过线性的方式由前到后顺序访问,所以访问效率比数组要低。
2.链表的一些操作,如链表的反转,链表存在环路的判断(快慢指针),双向链表,循环链表相关操作。
3.队列(特殊的如优先级队列),栈的应用。(比如队列用在消息队列,栈用在递归调用中)
4.二叉树的基本操作
二叉树的三种遍历方式(前序,中序,后序)及其递归和非递归实皮桐现,三种遍历方式的主要应用(如后缀表达式等)。相关操作的时间复杂度。
5.字符串相关
整数,浮点数和字符串之间的转换(atoi,atof,itoa)
字符串拷贝注意异常检查,比如空指针,字符串重叠,自赋值,字符串结束符'/0'等。
二.算法部分
1.排序算法:
排序可以算是最基本的,最常用的算法,也是笔试面试中最常被考察到的算法。最基本的冒泡排序,选择排序,插入排序要可以很快的用代码实现,这些主要考察你的实际编码能力。堆排序,归并排序,快排序,这些算法需要熟悉主要的思想,和需要注意的细节地方。需要熟悉常用排序算法的时间和空间复杂度。
各种排序算法的使用范围总结:
(1)当数据规模较小的时候,可以用简单的排序算法如直接插入排序或直接选择排序。
(2)当文件的初态已经基本有序时,可以用直接插入排序或冒泡排序。
(3)当数据规模比较大时,应用速度快的排序算法。可以考虑用快速排序。当记录随机分布的时候,快排的平均时间最短,但可能出现最坏的情况,这时候的时间复杂度是O(n^2),且递归深度为n,所需的栈空间问O(n)。
(4)堆排序不会出现快排那样的最坏情况,且堆排序所需的辅助空间比快排要少。但这两种算法都不是稳定的,若要求排序时稳定的,可以考虑用归并排序。
(5)归并排序可以用于内排序,也可以用于外排序。在外排序时,通常采用多路归并,并且通过解决长顺串的合并,产生长的初始串,提高主机与外设并行能力等措施,以减少访问外存额次数,提高外排序的效率。
2,查找算法
能够熟练写出或者是上机编码出二分查找的程序。
3.hash算法
4.一些算法设计思想。
贪心算法,分治算法,动态规划算法,随机化算法,回溯算法等。这些可以根据具体的例子程序来复习。
5.STL
STL(Standard Template Library)是一个C++领域中,用模版技术实现的数据结构和算法库,已经包含在了C++标准库中。其中的vecor,list,stack,queue等结构不仅拥有更强大的功能,还有了更高的安全性。除了数据结构外,STL还包含泛化了的迭代器,和运行在迭代器上的各种实用算法。这些对于对性能要求不是太高,但又不希望自己从底层实现算法的应用还是很具有诱惑力的。
1. 什么是数据结构?
数据结构是数据组织(存储)和操作进行检索和访问的方式。它还定义了不同数据集相互关联、建立关系和形成算法的方式。
2. 描述数据结构的类型?
列表:链接到先前或/和后续数据项的相关事物的集合。
数组:所有相同的值的集合。
Records:字段的集合,每个字段都包含来自单一数据类型的数据。
树:在分层框架中组织数据的数据结构。这种形式的数据结构遵循数据项插入、删除和修改的顺序。
表格:数据以行和列的形式保存。这些与记录相当,因为数据的结果或更改反映在整个表中。
3. 什么是线性数据结构?请举例
如果数据结构的所有元素或数据项都按顺序或线性顺序排列,则数据结构是线性的。元素以非分层方式存储,因此除了列表中的第一个和最后一个元素外,每个项目都有后继者和前驱者。数组、堆栈、字符串、队列和链表,都属于线性数据结构。
4. 数据结构有哪些应用?
数值分析、操作系统、人工智能、编译器设计、数据库管理、图形、统计分析和仿真。
5、文件结构和存储结构有什么区别?
区别在于访问的内存区域。存储结构是指计算机系统内存中的数据结构,而文件结构是指辅助存储器中的存储结构。
6、什么是多维数组?
多维数组的意思是指三维或者三维以上的数组。 三维数组具有高、宽、深的概念,或者说行、列、层的概念,即数组嵌套数组达到三维及其以上。是最常见的多维数组,由于其可以用来描述三维空间中的位置或状态而被广泛使用。
7. 什么是链表数据结构?
这是最常见的数据结构面试问题之一,面试官希望你能给出全面的答案。尝试尽可能多地解释,而不是用一句话来完成你的答案!
它是一个线性数据结构或一系列数据对象,其中元素不存储在相邻的内存位置。元素使用指针链接以形成链。每个元素都是一个单独的对象,称为节点。每个节点有两项:数据字段和对下一个节点的引用。链表中的入口点称为头。如果列表为空,则头部为空引用,最后一个节点具有对空的引用。
一个链表是一个动态的数据结构,其中节点的数量是不固定的,这样的例子有扩大和缩小需求的能力。
它适用于以下情况:
我们处理未知数量的对象或不知道列表中有多少项目;
我们需要从列表中进行恒定时间的插入/删除,就像在时间可预测性至关重要的实时计算中一样;
不需要随机访问任何元素;
该算法需要一个数据结构,无论对象在内存中的物理地址如何,都需要在其中存储对象;
我们需要在列表中间插入项目,就像在优先队列中一样;
一些实现是堆栈和队列、图形、名称目录、动态内存分配以及对长整数执行算术运算
8.什么是双向链表?请举例
它是链表的一种复杂类型(双端 LL),其中一个节点有两个链接,一个连接到序列中的下一个节点,另一个连接到前一个节点。这允许在两个方向上遍历数据元素。
举例:
带有下一个和上一个导航按钮的音乐播放列表
具有 BACK-FORWARD 访问页面的浏览器缓存
浏览器上的撤消功能
9. 为什么要做算法分析?
一个问题可以使用多种解决算法以多种方式解决。算法分析提供对算法所需资源的估计,以解决特定的计算问题。还确定了执行所需的时间和空间资源量。
算法的时间复杂度量化了算法运行所花费的时间,作为输入长度的函数。空间复杂度量化了算法占用的空间或内存量,以作为输入长度的函数运行。
;Ⅵ 经典笔试面试知识整理,数据结构与算法(代码演示)
题目描述:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
输入描述: array: 待查找的二维数组 target:查找的数字
输出描述:
查找到返回true,查找不到返回false
题目描述:
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
题目描述: 输入一个链表,从尾到头打印链表每个节点的值。
输入描述: 输入为链表的表头
输出描述: 输出为需要打印的“新链表”的表头
题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
1、题目描述:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39
2、题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
3、题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
4、题目描述:
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
1、题目描述:
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
2、题目描述:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
题目描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
题目描述:
用两个栈来实现一个队列,完成队列的Push和Pop操作, 队列中的元素为int类型。
题目描述:
输入一个链表,输出该链表中倒数第k个结点。
Ⅶ java面试笔试,数据结构和算法考到什么程度
你说的那个数据结构不一定考的。
Java面试就那么点东西,各个公司也不一样。
有的分笔试和机试。这些公司想看看实际面试人员的能力,节省了以后的时候。
笔试中,无非就是一些概念性的东西巴了。
比如:jsp是servlet吗?
servlet的生存周期;还有一些面向对象的知识。这些平常用心的话都没问题,即使临阵磨枪也行。
那么机试就的要看你自己的能力了,对框架的属性程度。还有就是在也不能常见的对数据
库的CRUD也就是增删改查操作。机试都好这口。
其实面试如果也没笔试机试那么就问几道题的话,如果是技术人,几道题下来就知道你的底子了,在问些逻辑上的也就知道要你还是不要你了。
在有你要对一些数据库知识了解一些。
做java的
oracle
得达到掌握
sql
server
了解就行
基本语法啥的就可以了
mysql
这个也得达到掌握
别的就不要会用到
Ⅷ 面试笔试中让设计一种算法,是不是必须要写出代码来啊
一般面试考算法会考察你几个方面
1. 如果考官觉得你基础知识不错,考算法一般就是看你对一些常见知道的熟练程度,是否会灵活运用。就是看你有没有解决一个新问题的能力。一般伪代码说想法就行,一般会较难的问题。
2. 若觉得你的基础知识不行,可能目的就是探查你有没有基础的代码能力了。因为有很多人能说,但是不能写,哈哈。
3. 有些公司一定要求是要写代码的。或者有一些考官是这种风格的。但是写的话多半都是简单的,所以有机会多熟悉一下,基本的像排序,冒泡,快排什么的啦。
Ⅸ 大公司笔试面试有哪些经典算法题目
1、二维数组中的查找
具体例题:如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。现在给出一个数字序列,允许使用一种转换操作:选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列?