从分享里找来的,只可惜没早点看到 。
看来我真的人老珠黄了,这些日子重新拿起算法书,发现思维能力又再次下了一个台阶,成功回到地下一层。翻看一些题目,觉得毫无思路,再一看附近的笔记,我
靠,原来这些东西我原来都曾搞定过的。。。
赶在十一长假结束,整理了一些零星的算法笔记,顺手都分享了,希望对面试有些帮助。不要相信有一夜壮阳的九阳神功,算法这玩意靠得是一点一滴的积累和思维
的磨练。一些所谓的方法和技巧,都只是给面试来只强心针喂一口大补丸,主要目的是给自己壮个胆,让自己看着自信一点。。。
【一】 时间受限
大部分的面试题,都是对时间复杂度有所要求的,如果有涉及,“最快”一类的字样,毫无疑问,先上时空原理,用空间来换时间。Hash,大数组,一
些辅助性的空间,都是首选。在我的面试经历中,有无数次用到过Hash和大数组的。不过,通常这不会是面试官想听的唯一解法,他们紧接着十有八九是会说
“如果只有xxxx空间呢?”。说此类方法只是为自己争取更多的时间,并且体现思考的完整性,简而言之,装B用。。。
eg1.1:求一个char(8bit)中,二进制1的个数,越快越好。 -- 《编程之美》
eg1.2:有一个整数数组A[N],让你不用除法,求另一个数组B[N],其中B[i] = A[0]*A[1] ... * A[N-1] /
A[i],期望复杂度是O(N)。
【二】 空间受限
这里的空间受限,指的是在大数据分析的逻辑下,空间受限的问题。大部分情况下,就是压缩。位图是一个很好的方法,用一个bit(或几个)取代更大
的int类型,最常见的位图是1bit 取代 1int,其实,很多时候,1bit可以取代更大的空间,这完全取决于你需要保留的信息。。。
eg2.1:有一个很大的文件,存放一堆7位的电话号码,号码无重复,请用最小的内存消耗,将其排序。 -- 《编程珠玑》
eg2.2:给10MB的内存,给一个4百万整数的文件,找一个不在文件中的整数。 -- (传说中的Google面试题)
【三】 基于文件
越来越多的大公司,开始关系对文件的处理,上面所说的空间受限的问题,其实也基本都是和文件打交道。基于文件的处理,基本都是寻找,或者排序,最
最核心的,就是减少文件读取的次数。除了位图法,还可以考虑哨兵,典型的案例就是外排中,增加单个文件大小的方法。
eg3.1:给定一个包含4300000000个32位整数的顺序文件,找到一个至少出现两次的整数。 --
(传说中的微软面试题,我曾经遇到过类似的) eg3.2:有一个文件,有很多很多的整数(也许有100亿),寻找其中最大的K个。 -- 《编程之美》
【四】 常见方法
你需要相信,面试官也是人,他不会有心情花30分钟给你描述一个问题,或者让你做50页纸的推导,考算法的目的只是为了你的思维能力,而不是真的想让你搞定一个复杂的问题。大部分问题,都是有比较快速清晰的解决方法的。。。
1. 分治法
这绝对是你必须考虑使用的一种方法,如果有可能的话。动态规划这东西,在面试的时候比较沉重,不好描述,不好书写,而分治却刚刚好,美丽,快捷,易书写,
是面试官杀人越货的首选武器。分治的用法实在是太多了,几乎是无所不在,二分,快排,种群计数,各个唯美无比。。。
eg4.1:给你一个长度为N的整数数组,请找出最大的子数组和。 -- 《编程之美》 eg4.2:求一个int(32bit)中,二进制1的个数。
-- 《代码之美》(注,不是编程之美是另一本书,有一章叫做种群计数,这是一种很酷的分治)
2. 排序和查找
排序出现的次数实在是太多了,很重要的一点,排序的东西才能用二分。二分是如此好用,以至于我们总是想着排序。查找和排序总是紧密联系的,当然,仅仅是为
了查找,做一次排序,你需要衡量一下代价。。。
eg4.3:有一个论坛,有ID发帖数目超过总数的一半,给你论坛所有帖子的ID列表,请你找到这个水王。 -- 《编程之美》
eg4.4:给一组一维的空间 [1, 6] [2, 4] ... ,请求是否有区间重叠。 -- 《编程之美》
3. 减小问题规模
很多时候,题目看上去很吓人,仔细分析一下,就可以刨去其中大部分的无关内容,获得真正的出题意图,这一点很重要。另外有些时候,题目会在空间上做出一些
限制,这个时候,你可以考虑动态的对数据规模进行缩减,比如用减法或除法抵消,用抑或抵消,等等。。。
eg4.5:给一个整数N,求它的阶乘N!,有几个0结尾。 -- 《编程之美》
eg4.6:盒子里有三种颜色的球,红黄蓝,可以用任意两个不同颜色的球,换两个另外颜色的球,比如1红 + 1黄 =
2蓝。现在盒子里面有171个红球,172个黄球,173个蓝球,问,能不能经过若干次交换,最终变成同一颜色的球。 -- TopLanguage
eg4.7:同eg4.3
eg4.8:有一组数,除了一个数只有1个,其他都是两两成对的,请找出那一个不成对的数。另,如果不成对的数有两个,该如何是好。
4. 常量法 典型的速餐方法,它的思想是,一组数,在某些情况下,和一定,通过这个常量,进行反推,可快速搞定一些问题。。。 eg4.9:有一副扑克牌(你可以用任意方式来表示),被抽去一张,请快速找出这抽去的一张是什么? -- 微软面试题,活生生
5. 编码 编码真是个好东西,它可以将复杂的问题抽象化。比如,对一个序列进行编码,可以直接映射到数组脚标上,大大提高访问速度。。。
eg4.10:最近一次百度笔试题
eg4.11:有1000瓶超级名贵的葡萄酒,其中有1瓶有毒。这种毒药很厉害,哪怕被稀释了1000000倍还是可以毒死人的。但这个毒药一定时间后才
会毒发,时长是1个月。为了不浪费这些葡萄酒,有1000个壮士决定花5周的时间将毒酒找出,他们只希望最多有10个人牺牲,你需要如何安排才能实现。
-- TopLanguage
6. 概率
不要轻视概率题,哪怕是最基本的概率常识。概率题之所以被青睐,因为它们往往违背直觉,容易让人陷入迷茫,这种场面是面试官喜闻乐见的。我曾经在
baidu面试中,被一道简单的概率题,调戏的脸面全无,至今想起,仍然是汗流满面。所以,为了人身安全,复习一下概率的基本知识吧。。。
eg4.12:有一个长度为N的链表,N未知。希望你只遍历一次链表,就从链表中等概率的挑出K个数。 -- TopLanguage
【五】 加速方法
很多时候,你给的算法基本正确,但是还不够优秀。面试官会希望你优化一下。优化的方法有很多,就基本的思路就是,考虑一下到底哪里出现了浪费。常见的浪费
有两种,一种是用了比较沉重的运算,比如除法、取模等,你可能需要为计算来加速。另外有时候,你的算法还太粗线条,比如只需要符号,你却计算了总数等
等。。。 eg5.1:求两个数的最大公约数。 -- 《编程之美》 eg5.2:有一个整数数组A[N],求其中连续N-1个数的最大乘积。 --
《编程之美》 eg5.3:估计一下快速排序的比较次数。 -- 《代码之美》
【六】 数据结构
大部分面试时候,我们都是面向数组来设计算法,因为简单变化多,面试官好把握。但其他数据结果,同样也很重要。AVL,B树那样的可能比较复杂,但是链表、树这样的结构,也经常出没,我个人就碰见多次。。。
1. 链表 eg6.1:给你一个单链表的头指针,在不使用大量附加数据或修改原有数据的前提下,检查一个单链表是否有环。 --
微软面试题,活生生 eg6.2:给你两个链表,如何判断其是否相交,如果相交,如何找到两个链表的第一个交点。 -- 《编程之美》
eg6.3:只给你一个指向链表中某元素的指针,请删除该元素。 -- 《编程之美》
2. 树 eg6.4:写堆排序的算法 eg6.5:判断一棵二叉树T中,是否包含另一颗二叉树P的结构。 -- 微软面试题,活生生
以上一些内容,只是管中窥豹而已,一不小心,还被我写成了题集。原先只是给我自己做个索引的,所以没有加任何求解的内容,如果有兴趣,可以查看相关出处。
题目来源主要是一些快餐式的书和论坛,包括《编程之美》《代码之美》《编程珠玑》,其中特别推荐,TopLanguage
Group的“今天我们思考”专辑。快餐吃多了总会不营养的,需要慢条斯理的按食谱吃点营养大餐才能真正的强身健体,比如高大爷的圣经,《算法导论》,还
有,波利亚的《怎样解题》。
归根结底,面试的算法其实不只是算法而已,面试官看重的是从做题过程中体现出的思考问题的能力,而不是最终的结果本身。你和面试官之间是一场配合和博弈,
你需要勾引面试官给你反馈,并抓住它们辅助思考,从而让他们满意。算法在面试中的地位,好比是托福在出国中的地位一样,必须但不是最重要的,它只是考量的
各个方面的一部分,不一定就决定生死。所以,有就让它更好点,没有就稍微补充点,足矣。我做过的面试其实不多,有的还不错,有的就像坨屎,只希望,从今往
后,努力让我的面试远离粪坑。。。
分享到:
相关推荐
总的来说,这个压缩包文件“GitHub优质项目汇总——程序员必知”是一个宝藏,它汇聚了GitHub上的精华,无论你是初学者还是经验丰富的开发者,都能从中找到适合自己的学习路径和提升空间。通过探索这些项目,你可以...
学习路线、后端基础、进阶知识点、笔试/面试题解、原创电子书、开发学习交流群等,在微信搜【小郎码知答】,你想要的告诉我,我会满足你。 或者扫描以下二维码关注我,我希望以后日子里能够一起成长、一起变强:cow_...
在科技行业中,阿里巴巴集团作为中国乃至全球的互联网巨头,始终以其招聘流程的严谨和高标准为人所知。对于那些渴望成为“阿里人”的求职者而言,笔试环节无疑是一道难以逾越的高墙。为了一窥阿里巴巴笔试题的奥秘,...
挤塑板生产用造型机sw18_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip
轿厢式电梯sw12可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip
1、文件说明: Centos8操作系统thai-scalable-waree-fonts-0.6.5-1.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf thai-scalable-waree-fonts-0.6.5-1.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm
内容概要:本文详细探讨了永磁同步电机(PMSM)中二阶自抗扰控制(ADRC)的应用,特别是将速度环和电流环合并的设计。文中介绍了ADRC的核心组件,包括跟踪微分器(TD)、扩张状态观测器(ESO)和非线性状态误差反馈控制律(NLSEF),并通过具体的Python和Matlab代码展示了这些组件的工作原理。此外,文章讨论了线性和非线性ADRC在合并控制中的实现及其优缺点,并强调了在Simulink建模时需要注意的技术细节。通过这种方式,ADRC能够显著提高电机的动态性能和抗干扰能力,尤其在面对复杂工况时表现更为突出。 适合人群:从事电机控制系统设计的研究人员和技术工程师,尤其是对自抗扰控制感兴趣的读者。 使用场景及目标:适用于需要提高永磁同步电机控制精度和效率的实际工程项目,旨在帮助读者理解和掌握ADRC的基本原理及其在速度环和电流环合并控制中的应用。 其他说明:文章不仅提供了理论解释,还包括了大量的代码片段和仿真技巧,有助于读者在实践中验证和优化控制策略。
电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。
《毛毛虫的袜子》伴奏.mp3
内容概要:电子设计竞赛(电赛)是旨在培养学生创新能力、实践能力和团队合作精神的科技竞赛。文章详细介绍了电赛的目的、流程、参赛要求及常见问题解答。竞赛目的在于通过解决实际问题激发创新思维、提升实践技能、增强团队合作和促进学术交流。竞赛流程分为报名、准备、竞赛、评审和颁奖五个阶段。参赛要求包括团队组成(3-5名学生,可跨专业组队)、配备指导老师、选择符合规定的项目主题以及确保作品符合技术规范。常见问题解答涵盖参赛专业限制、所需准备材料、评审标准和培训指导等方面; 适合人群:对电子技术感兴趣并希望提升自身能力的大学生; 使用场景及目标:①为有意参赛的学生提供详细的参赛指南;②帮助学生了解竞赛流程和要求,提前做好充分准备; 阅读建议:本文为有意参加电赛的学生提供了全面的信息和指导,读者应重点关注竞赛流程、参赛要求及评审标准等内容,以便更好地准备竞赛。
NLTK 是一个广泛使用的 Python 库,专注于自然语言处理(NLP)。它提供了许多工具和算法来处理文本数据,例如分词、词性标注、句法分析等。然而,这些功能通常需要依赖大量的语言数据(如语料库、词典、预训练模型等),这些数据被统称为 NLTK 数据资源 。 主要内容: a. 语料库(Corpora) 这些是用于训练和测试 NLP 模型的文本数据集合。 示例:gutenberg(古登堡计划的书籍)、brown(布朗语料库)、reuters(路透社新闻语料库)等。 b. 词典与词汇资源(Lexical Resources) 包括词频表、同义词词典(如 WordNet)、停用词列表等。 示例:wordnet(WordNet 同义词数据库)、stopwords(多语言停用词列表)。 c. 预训练模型(Pre-trained Models) 包含一些常用的 NLP 模型,例如分词器、词性标注器、命名实体识别器等。 示例:punkt(用于句子分割的预训练模型)、averaged_perceptron_tagger(词性标注器)。 d. 其他资源 包括一些辅助工具和配置文件,用于支持 NLTK 的各种功能。
内容概要:本文介绍了Python爬虫的基础知识,包括定义、优势、基本流程、常用库以及注意事项。爬虫是一种自动抓取网页信息的程序,Python因其简洁的语法、强大的库支持和跨平台特性成为爬虫开发的理想选择。文章详细讲解了爬虫的基本流程:发送请求、解析内容、存储数据和异常处理,并列举了requests、BeautifulSoup、Scrapy、lxml等常用库的功能。最后给出一个简单示例演示爬取网页标题的过程,同时强调了遵守robots.txt协议、设置合理请求间隔、处理反爬虫机制等注意事项。; 适合人群:对Python爬虫感兴趣的初学者或有一定编程基础的技术人员。; 使用场景及目标:①了解爬虫的工作原理和应用场景;②掌握Python爬虫的基本开发流程和常用库的使用方法;③能够编写简单的爬虫程序,为后续的数据分析、机器学习等任务提供数据支持。; 阅读建议:读者应结合实际案例进行练习,在理解理论的同时注重实践操作,确保能灵活运用所学知识。
内容概要:本文详细介绍了基于西门子PLC博途V17和WinCC 7.5sp2的一套高效工程模板。博途部分利用多重背景技术和梯形图+SCL混合编程,极大提升了编程效率和维护简便性。WinCC部分通过结构变量和面板实例,简化了人机界面的组态工作。此外,模板还包括丰富的功能库如PID控制、语音报警、报表生成功能等,显著增强了系统的实用性和用户体验。 适合人群:自动化领域的工程师和技术人员,尤其是初学者和有一定经验但仍需提高效率的从业者。 使用场景及目标:适用于工业自动化项目的快速开发与部署,旨在减少重复劳动,提高开发效率,缩短项目周期。通过使用该模板,工程师能够更快地上手并掌握先进的编程技巧和组态方法。 其他说明:文中提供了具体的代码示例和实际应用场景,有助于读者更好地理解和应用这些技术。同时提醒用户注意版权和使用权限的问题。
工作簿7777.xlsx
立式插秧机sw16可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip
稳压罐sw16_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip
电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。
电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。
内容概要:文章详细介绍了拦截器(Interceptor)的工作机制及其在HTTP请求响应全流程中的作用,包括在请求到达目标处理器之前、处理器处理请求之后以及视图渲染之前执行特定操作。拦截器的应用广泛,如日志记录、权限控制、性能监控、请求参数处理和身份验证与授权等。文中还提供了创建拦截器的方法,可以通过实现`HandlerInterceptor`接口或继承`HandlerInterceptorAdapter`类来创建,并且展示了如何配置拦截器,将其添加到配置中以拦截所有请求,还可以通过`@Order`注解配置拦截器的执行顺序。多个拦截器按照配置顺序依次执行其`preHandler`、`postHandler`和`afterCompletion`方法,确保请求处理流程的有序性和灵活性。 适合人群:具有一定Java Web开发经验,尤其是熟悉Spring框架的开发者。 使用场景及目标:①理解拦截器在Web应用中的工作原理;②掌握如何创建和配置拦截器以实现特定功能;③学习如何利用拦截器实现如日志记录、权限控制等功能,提升Web应用的安全性和性能。 阅读建议:在学习过程中,应结合实际项目需求,理解每个拦截器方法的作用,并尝试在自己的项目中实现相应的拦截器,以加深对其工作机制的理解。