精华内容
下载资源
问答
  • 算法题
    千次阅读 多人点赞
    2022-04-05 16:27:20

    1.为什么企业招聘会面算法题?

               李开复在《算法的力量》中,谈到算法的重要性时,曾说到:算法是计算机科学领域最重要的基石之一,但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门就产生了一种误解,认为学计算机就是学各种编程语言,或者认为,学习最新的语言、技术、标准就是最好的铺路方法。其实大家都被这些公司误导了。编程语言虽然该学,但是学习计算机算法和理论更重要,因为计算机算法和理论更重要,因为计算机语言和开发平台日新月异,但万变不离其宗的是那些算法和理论,例如数据结构、算法、编译原理、计算机体系结构、关系型数据库原理等等。

           但是,绝大多数工作过的小伙伴都会发现,实际在工作中努力刷的leetcode,牛客算法题,在实际工作中基本用不着,感觉很无用。到底学算法有啥用?既然工作中一般用不着为啥有需要学呢?

     1.1一般哪些公司会面算法题呢?

           其实面试算法题,一般也就是主流的一线大厂会重点面试算法题,而且每轮面试基本都会面下。业内最看重算法的就是字节跳动,纯技术岗一般每一轮都有1-2道算法笔试题,而且就算是算法总监级别的人也要手写算法面试题哈(曾经有个leader是阿里,携程算法总监,去字节面试,直接上来手写两道算法题,直接吐血)。当然面试题也不全是纯理论的数据结构题目,有些就是逻辑题目,考察你的逻辑思维能力,复杂业务场景的思考能力,因为大厂有些业务逻辑是真的挺复杂严谨的。当然也不是每个大厂每一轮都有算法面试题,比如美团点评就是第一轮面算法,后面就没有了,其他的要看公司,甚至事业部,岗位情况。

          其他的中小型的公司其实更看重能不能干活,能不能直接上手项目。所以对算法题要求也比较松散,很多中小型公司一般社招都不会直接面试算法题,甚至不面试算法题,而是更看重相关技术栈的掌握能力。(这也是很多培训机构,很多跨专业小伙伴可以进入IT行业的主要原因,所以这帮小伙伴绝大多数刚出来也基本都是去了中小型公司)。

          注意,一般来说,不管是大公司,还是中小型公司。对于校招来说算法数据结构这些基础的东西一般都是必面的。因为校招更看重学校,其次更看重基础。只是算法面试的深度,算法面试的考核比重有所不同而已。

    1.2 哪些岗位会面算法题呢?

          即使是大厂并不是所有的岗位都会面试算法题,权重也有所不同。但是一般纯技术开发岗都会面试下算法题,这块还是要必要的,逻辑能力,基础的数据结构能力,直接决定了开发的代码的质量,尤其大厂这块对代码性能还是有要求的,比如java岗,平台开发岗等。

         有些比如数据分析岗,属于使用工具,使用平台的人,一般对算法要求会低些。其实客观地说,以大数据为例,大厂因为平台建设的特别好特别完善。很多开发技术其实没啥难度,更多是在公司规范内进行数据分析开发,难的是业务逻辑梳理,业务口径落地实施。这块的话就需要考核大家的思维逻辑能力了,那这个就可以通过算法逻辑题面试了。

    2.关于算法题与计算机基础知识储备看法

          如果是校招生,因为校招更看重学校和基础知识。建议这块基本的算法题,计算机基础知识必须要掌握,很多也就是八股文,没啥技术含量,该背的背。因为校招大中小公司一般都会面试算法题,大厂更甚。其次注意一般校招不仅会面算法逻辑题,还会面很多计算机专业的相关知识,比如网络,操作系统,汇编等等。所以校招对于非计算机专业的小伙伴转行来说有点难度的,因为校招出的试卷是基于计算机相关专业的学生设计的。

         如果是社招生,你想去大厂,一线大厂比如阿里,腾讯,百度,京东,字节等公司。基本上简单的leetcode题目需要提前准备一下,刷一下,这块大厂主流的技术岗位算法逻辑题几乎必面吧。大家注意,这里算法题是个大的概念,包括逻辑题,并不全是数据结构等理论题目。有些就是公司事业部硬性指标,具体看事业部,有些公司的事业部也不面算法题。当然如果你社招去的是80%的中小规模的公司,其实算法题也不怎么面,你不会也没关系。说实在这玩意很多在工作中直接用不着,很多中小公司也不面,没啥太大意思。

         比如下,阿里大数据数仓面试题,算法题也就是简单的逻辑题

    3.关于算法学习准备建议

             既然改变了现状,那就改变自己。

           如果你想去大厂,就需要提前准备算法题,现在我们涤生大数据团队,目前有几十个社招的小伙伴在一起学习,也有十几个校招的(在校大学生)一起学习,本科生研究生,985/211,普通院校小伙伴都有。很多小伙伴想去大厂,尤其是校招的小伙伴想去大厂,那算法,数据结构,计算机基础知识这块必须要准备了。说实在的,这块东西真的很多很杂,如何进行持续高效的学习呢?

         基于目前这块情况,我们团队各大厂在职小伙伴内部搜集分类汇总了各大厂常见的校招社招算法面试题。带领大家一起学习,一起准备哈。提前布局大厂招聘哈。感兴趣的小伙伴也可以加入我们交流群哦,一起刷题,一起抱团成长哈。个人建议算法这块一般需要至少半年前开始布局吧

    更多相关内容
  • iOS 面试必看算法题

    2019-05-07 23:30:27
    iOS 面试的要求正在逐步提高,对于算法的要求也在逐步提升,这个文件带领你学习iOS 算法。让你直通BATJ
  • js所有的算法,自己总结的,如有遗漏,请留言。希望可以帮助到需要的人
  • C++写算法题中各类输入输出、常用函数,算法数据结构 五大常用算法
  • 算法 ,简单 入门 LeetCode网站开放的简单算法题,用于平时检验自己的算法能力,程序设计.
  • 用Java刷算法题的常用API一览,适用于准备求职时刷leetcode、lintcode等算法题,或面试白板编程。
  • 华为校园招聘笔试算法题汇总.doc
  • java笔试常见的算法题

    2013-09-24 23:43:58
    全排序、二分查找、冒泡排序、阶乘、最大公约数、最小公倍数、...这是里面包含的算法,本人在准备笔试的时候找的,算法尽量采用最优的。 所有的代码均经过测试,个人觉得没有问题,如果哪位大牛找到错误,欢迎批评指正
  • 经典面试算法题N道

    2018-06-29 20:50:19
    经典面试算法题N道,经典面试算法题N道,经典面试算法题N道,经典面试算法题N道
  • 去哪儿网校园招聘笔试试题算法题汇总.docx去哪儿网校园招聘笔试试题算法题汇总.docx去哪儿网校园招聘笔试试题算法题汇总.docx去哪儿网校园招聘笔试试题算法题汇总.docx去哪儿网校园招聘笔试试题算法题汇总.docx去...
  • 算法入门的学习 ,快速入门,提高算法能力,优化逻辑结构。
  • 本人上一次刷题还是大一的C语言期末考试……但是面试中算法考核截止上岸前一直保持着100%正确率的光辉记录。 本文将给你指明一条刷题的决胜指南。并从算法的重要性、题库的选择以及刷题的三大步骤分别进行讲解,彻底...

    写在前面

    “题海茫茫,leetcode上千道。我该怎么刷题?”
    “题目刷完了,面试时手撕代码还是脑袋空空,怎么办?”
    你在准备春、秋招面试算法题是不是为这两个问题迷茫过?

    那么恭喜你,你发现了这篇宝藏文章。本文将给你指明一条刷题的决胜指南。并从算法的重要性、题库的选择以及刷题的三大步骤分别进行讲解,彻底解决你所有关于面试算法所有的困扰。

    温馨提示,本文不会教你如何提升刷题水平,也没有奔着蓝桥杯、ACM等各类算法大赛破纪录的标准冲刺。作者本人就是一个智商平庸的程序员,没有什么说的出口的竞赛经验,上一次刷题还是大一的C语言期末考试……但是面试中算法考核截止上岸前一直保持着100%正确率的光辉记录。

    在这里插入图片描述
    本文的目的纯粹而真实:教你刷最少的题,用最少的时间,最稳妥的方法拿下面试算法题!

    如果你的代码能力平平的新手小白,那么这篇文章一定能让你受益匪浅;如果你已经蝉联各种金奖银奖,那就当网络一线牵,相逢即是缘。看在这场缘分上,点个赞再走呗~

    好了,废话说到这里。

    来,我们发车!

    算法,作为校招乃至社招最重要的考核标准之一,也是考核通过一决生死的关键凭据。是各位候选人准备面试的“重头戏”。

    首先,你知道手撕代码为什么那么重要吗?

    因为算法能力可以看出应聘者的计算机基础能力。这里的基础能力包括:扎实的编程能力、良好的代码习惯以及解决问题的思维能力。

    你可能会不屑一顾,算法在实际工作中真的有用吗?

    说句实话,非常有用又非常“没用”。
    没用在于在你真正入职之后,繁忙的业务和紧促的需求可能让你根本没有时间去思考各种算法如何应用,直接大把大把可复用代码copy;但正因为这些“不经思考”的代码泛滥成灾,一个对于代码严谨性、鲁棒性高标准、严要求的人才就成为了面试官眼里的“香饽饽”。

    一个能够挽救这堆“垃圾代码”的人简直就是上帝呀!

    在这里插入图片描述
    所以,算法能力对于长期的需求迭代和工程架构的稳定性而言,是非常非常重要的,也是程序员从普通的搬砖码农晋升到架构师必须具备的能力。
    既然它那么重要,作为面试的核心评判标准,不过分吧?

    接下来,你可能又好奇了:一恩姐姐,为什么你前面说,这篇文章不能提升算法能力,但能拿下手撕代码呢?
    问得好,让我来告诉你们:

    面试手撕代码的规律是什么,和一般的算法题有啥区别?

    首先给各位分享一个宝藏真题网站:https://github.com/afatcoder/LeetcodeTop,github的star已破12k(2022.02),它是我见过的最全面最好用的面试算法真题汇总。

    它的题源来自于牛客网面经笔经、CSDN以及热心网友分享,真实可靠,并且实时保持更新,目前共收录了811道真题(仍在持续增长中)。支持按公司、部门、岗位组合查询仓库中的数据,方便大家高效检索,针对性应对面试。

    进入首页我们便能看到它按照考察的频度由高到低对算法题进行排序。面试爱考啥一览无余。

    在这里插入图片描述
    通过对这个网站题型的剖析,我们非常清晰地可以总结出以下三条规律:

    • 数据结构偏好:数组&哈希表 > 字符串&链表 > 二叉树&图 > 其他;
    • 难度偏向于简单、中等类;
    • 考察密度较为集中;

    下面分别详细解释一下这三点:

    1. 数组&哈希表 > 字符串&链表 > 二叉树&图 > 其他;

    我做了一个简单的统计,该网站自2020年1月开始统计一共811道算法题,其中数组&哈希表占226道(25.7%),字符串占95道(10.8%),链表占102道(11.6%),二叉树、图占120道(13.6%),栈&队列占84道(9.5),还有一些杂七杂八的数学题和设计题占76道(8.6%)。

    这么一算下来已经包揽了互联网80%的题型。而我上述列出来的题型其实都是大家本科时学到的最最基础的数据结构。甚至没有排序算法、BFS/DFS,更别提什么贪心算法动态规划了。

    所以,比起去死磕那20%将脑细胞杀光的题型,首先要将这80%的分值稳稳拿到手。等到基础分稳操胜券了,我们便可以去心安理得地锦上添花了。

    1. 题目偏向于简单、中等类;

    同样用数据说话,难度题只占103道(11.7%)这说明什么呢?

    大厂算法题对题目难度要求不高。面试总共1小时左右时间,算法考查最多也只能占30min左右的时间。对于难度大的题目,大部分候选人基本无法保证在这么短时间内给出一个正确解法。因此较为简单直接的题型成为考核的不二选择。

    1. 考察密度较为集中;

    大家可以观察一下这些高频题目最近考察时间,是不是就是昨天,前天,甚至基本所有题都在一周内被反复考过。这说明啥?说明面试官的题库高度重合且更新频率低!

    有一个关系不错的面试官小哥哥跟我说,他这一年面试只考过3道题,翻来覆去反复考。“方便呀”,他懒懒地说,“平时工作那么忙,也没太多时间研究那么多题型。一般会提前花点时间搞透几道经典题型就用上了,等以后有空再换吧。”看起来这个老哥的“有空”是迟迟未到。

    所以呢,高频题的生命周期是永久的,是经久不衰的,是反复利用的。这个公司考到的题说不定换一家公司还会考。好好琢磨高频题是一个非常省时省力的小技巧。

    说了那么多,帮大家总结一下吧。优先看 高频的、难度中等偏低的、较基础的数据结构的题型
    答应我,这一步先确保做好,完完全全不需要动脑,只需要稍微努力就能成功战胜70%的面试算法。

    当然了,也不是说到此为止了。选择了去支持一恩姐姐的你们,智商肯定是胜于常人的(手动狗头)剩余的30%还得是要努努力好好争取的。

    下面就来说说具体的刷题方法吧?

    题海茫茫,题库千万。我该如何选择?

    现在还在困惑这个问题吗?别愁了,有这个时间我都刷了2道题了。就看三:

    资源的位置也贴在上面了,大家在牛客网上都可以直接搜到。我其实非常推崇大家直接用牛客网题库刷题,它的IDE和界面很大程度上还原了真实面试环境。大家提前熟悉一下“考场氛围”对于当天面试的手感和心态都很有帮助~

    我刷题的主要输出是剑指Offer,LeetCode和公司真题都是随意打打辅助。对于剑指,我是每一道题都认真刷了至少3遍,刷后仔细总结、举一反三。而LeetCode主要是会针对一些弱点题型进行专项突破,没有去系统地刷。

    同时在准备某家公司面试前一周,我会提前三四天每天刷一份该公司的算法真题,主要是用来碰运气,万一这两个面试官正好好兄弟互抄题库呢?

    在这里插入图片描述
    现在开始说最重要的点的了,

    到底该怎么刷题,才能算是真正掌握这道题呢?

    我们分三个阶段一一讲解,分别是:刷题前、刷题时和刷题后;

    一、刷题前准备

    大家一定要抛弃一个错误观念,刷题绝对不是为了那毫无意义的数目和排名。而是为了去掌握一类题型、去巩固数据结构。因此比起去说“我昨天又刷了10道题”,我更愿意去说“我昨天把双向链表这一类问题搞透了。”

    所以在刷题的时候一定要刷经典题,要举一反三,要反复刷,从一类题抽象出共通的解法,才能以不变应万变,这才是刷题的本质,而不是单单为了刷题而刷题。

    有了这样一个大方向之后,我们第一步要做的就很明确:分类以及确定优先级。按照数据结构的类别进行分类就好啦,比较现成的分类可以直接按照《剑指Offer》这本书的章节来刷;而优先级则可以根据上面总结出的题型规则进行排序。我做了一个分类大概是:

    哈希表与字符串 > 链表 > 二叉树与图 > 二分查找与二叉排序树 > 栈、队列、堆 > 其他(主要是一些数学问题)> 递归、回溯与分治 & 贪心算法 > 搜索 > 复杂数据结构 > 动态规划

    二、刷题时思考

    刷题我有自己的一套组合拳,现在来给大家拆动作讲解一番。

    首先刷题一定是有针对性地刷,看完题目后请各位先来一个灵魂三问:

    1. 这道题属于哪类题型?
    2. 这类题型的解法是什么?
    3. 有没有模板可以套?

    明确后,就拿出模板直接套。这里的模版是你在刷完题后对这类题型总结的模版,具体的总结方法下面小节会提到。

    如果一套命中,那么恭喜你,你总结的模板是通用且合适的;如果发现没有模板或解题思路也不用着急。此时就当作面对一道新的算法题并尝试用自己学过的算法知识解决。

    第一次写题不用对解题速度过于苛刻,可以给自己2~3小时时间慢慢摸索最好的方式。

    时间一过,无论你有没有解出来,都应该结束这道题了。接下来你要做的就是去看看别人的解法和思路。如果你是在牛客网刷题,可以直接点击左上角的“题解”。

    在这里插入图片描述

    一般点赞最多的是最佳的解法,我们要去看看别人的代码好在哪里,和自己的代码有什么区别。主要是从解题的思路、时间、空间复杂度等角度切入,以及是否能从别人代码中获取一些通用的启发。

    站在巨人的肩膀上,才能看得更远。

    在吸取他人精华后,需要再刷一遍题。这一遍刷题主要是去证实你是否真正理解并掌握了最佳解法。这一遍成功AC后,你这道题才算是真正的“刷”完。

    三、刷题后总结

    这一步应该是最关键的一步。

    我从学生时代就一直秉承着总结是将知识真正化为己用的最核心的方法。即使到了工作阶段,依然非常受用。

    对于面试算法的总结,我会去按题型进行分类,并且对于每一类题型我都会总结出一套伪代码。
    每每刷完一题,我便将这道题所总结出的思路归纳到这类题型下:

    1. 首先看下这个思路与伪代码的契合度。如果无法直接套用,有2个原因。1是伪代码不够通用,2是着实属于一道新题型;
    2. 如果是1,需要根据总结出的思路进一步完善自己的伪代码;
    3. 如果是2的话,可以作为这一类题型的一个衍生题型,单独去记忆。这里的记忆不是去背题,而是去总结另一套模版。

    可能有的人会好奇伪代码怎么写,我这里教大家一个通用的方法:既然不好抽象解法,我们抽象题目。将题目去简化为一个知识点,然后针对这个知识点写算法。

    给大家举一个例子:
    “滑动窗口算法”类题型可以用于解决最小覆盖子串、找到字符串中所有字母异位词、无重复字符的最长子串类问题。

    我总结了一套滑动窗口算法的抽象思想,可以以不变应万变:

    int left = 0, right = 0;
    
    while (right < s.size()) {
        window.add(s[right]);
        right++;
        
        while (valid) {
            window.remove(s[left]);
            left++;
        }
    }
    

    总结的思路详细写在这篇文档里,大家速速进来学习一下:https://blog.csdn.net/qq_29966203/article/details/100070662

    有时候我会发现自己对于某一类题无法总结出模版,或一直卡壳在一类题时。我就会专门抽出一定的时间专项攻克。这个时候我就会拿出题海战术:LeetCode。因为LeetCode题实在太多了,应有尽有。我会在LeetCode上搜索该类题直接一个猛刷的大操作,相信在千锤百炼后,脑部和手部的记忆也会给你一套自己的方法论。

    看到这里,如果你对总结仍然有点云里雾里,不知如何下手。

    咳咳,那干货这不就来了?

    毕竟宠粉如一恩姐姐为各位上岸可是倾心倾力,操碎了心。
    在这里插入图片描述
    我在总结过程中,按照《剑指Offer》的目录分成了十二类,每一类我都从剑指和LeetCode选择了几道极具有代表性的题型(也可以说是知识点型题)并写出了对应的解法,每道题后面标注了LeetCode/剑指上对应的题号,方便大家查询并自行练习。

    家人们,直接冲就完事儿了。

    第一章 链表:https://blog.csdn.net/qq_29966203/article/details/100496138

    • leetcode
      • 例1:链表逆序(206)
      • 例1b:链表逆序2(92)
      • 例2:链表求交点(160)
      • 例3:链表求环(141)
      • 例4:链表划分(86)
      • 例5:复杂链表的复制(138)
      • 例6:2个排序链表归并(21)
      • 例7:K个排序链表归并(23)
    • 剑指offer
      • 例1:从尾到头打印链表(3)
      • 例2:链表中倒数第k个节点(14)
      • 例3:反转链表(15)
      • 例4: 合并两个排序链表(16)
      • 例5: 复杂链表的复制(25)
      • 例6: 两个链表的第一个公共节点(35)
      • 例7: 孩子们的游戏(圆圈中最后剩下的数)(45)
      • 例8:链表中环入口节点(54)
      • 例9:删除链表中重复节点(55)

    第二章 栈、队列、堆:https://blog.csdn.net/qq_29966203/article/details/100550574

    • leetcode
      • 例1 使用队列实现栈(225)
      • 例2 使用栈实现队列(232)
      • 例3 包含min函数的栈(155)
      • 例4 合法的出栈队列(946)
      • 例5 简单的计算器(224)
      • 例6 数组中第K大的数(215)
      • 例7 寻找中位数(295)
    • 剑指offer
      • 例1:用两个栈实现队列(5)
      • 例2:包含min函数的栈(20)
      • 例3:栈的压入、弹出序列(21)

    第三章 贪心算法:https://blog.csdn.net/qq_29966203/article/details/94612334

    • leetcode
      • 例1:分发饼干(455)
      • 例2:摇摆排序(376)
      • 例3:移除K个数字(402)
      • 例4a:跳跃游戏(55)
      • 例4b:跳跃游戏2(45)
      • 例5:射击气球(452)
      • 例6:最优加油方法
    • 剑指offer
      • 例1:剪绳子(66)
    • 2019校招
      • 例1:安置路灯(3)

    第四章 递归、回溯与分治:https://blog.csdn.net/qq_29966203/article/details/93963493

    • 剑指Offer
      • 例1:Fibonacci数列
      • 例2:跳台阶
      • 例3:变态跳台阶
      • 例4:矩形覆盖
      • 例5:矩阵中的路径(64)
      • 例6:机器人的运动范围(65)
      • 例7:把数组排成最小的数(32)
      • 例8:字符串的排列(27)
      • 例9:数组中的逆序对
    • leetcode
      • 例1:计算右侧小于当前元素的个数
      • 例1:求子集1(原数组不包含重复元素)
      • 例2:求子集2(原数组包含重复元素)
      • 例3:括号生成
      • 例4:N皇后
      • 例5:火柴棍摆正方形(473)

    第五章 二叉树与图:https://blog.csdn.net/qq_29966203/article/details/96424693

    • leetcode
      • 例1:路径之和(113)
      • 例2:最近的公共祖先(236)
      • 例3:二叉树转链表(114)
      • 例4:侧面观察二叉树(199)
      • 例5:课程安排(有向图判断环)(207)
    • 剑指offer
      • 例1:重建二叉树(4)
      • 例2:树的子结构(17)
      • 例3:二叉树的镜像(18)
      • 例4:从上往下打印二叉树(22)
      • 例5:二叉树中和为某一值的路径(24)
      • 例6:二叉搜索树与双向链表(26)
      • 例7:二叉树的深度(37)
      • 例8:平衡二叉树(38)
      • 例9:二叉树的下一个节点(56)
      • 例10:对称的二叉树(57)
      • 例11:按之字形顺序打印二叉树(58)
      • 例12:把二叉树打印成多行(59)
      • 例13:序列化二叉树(60)

    第六章 二分查找与二叉排序树:https://blog.csdn.net/qq_29966203/article/details/100169820

    • leetCode
      • 例1:插入位置(35)
      • 例2:区间查找(34)
      • 例3:旋转数组查找(33)
      • 例4:二叉查找树编码与解码(449)
      • 例5:逆序数(315)
    • 剑指offer
      • 例1:旋转数组的最小数字(6)
      • 例2:二叉搜索树的后序遍历序列(23)
      • 例3:数字在排序数组中出现的次数(36)
      • 例4:二叉搜索树第k个结点(61)
    • 2019 校招
      • 例1:丰收(11)

    第七章 哈希表与字符串:https://blog.csdn.net/qq_29966203/article/details/100029889

    • leetcode
      • 例1:最长回文串(409)
      • 例2:词语模式(290)
      • 例3:同字符词语分组(49)
      • 例4:无重复字符的最长子串(3)
      • 例5:重复的DNA序列(187)
      • 例6:最小窗口子串(76)
    • 剑指offer
      • 例1:替换空格(2)
      • 例2:数组中出现次数超过一半的数字(28)
      • 例3:最小的K个数(29)
      • 例4:第一个只出现一次的字符(34)
      • 例5:数组中只出现一次的数字(39)
      • 例6:左旋转字符串(42)
      • 例7:反转单词顺序序列(43)
      • 例8:把字符串转换成整数(48)
      • 例9:数组中重复的数字(49)
      • 例10:字符流中第一个不重复的字符(53)

    第八章 搜索:https://blog.csdn.net/qq_29966203/article/details/100088992

    • leetcode
      • 例1:岛屿数量(200)
      • 例2:词语阶梯(127)
      • 例3:词语阶梯2(126)

    第九章 动态规划:https://blog.csdn.net/qq_29966203/article/details/95489974

    • leetcode
      • 例1:爬楼梯(70)
      • 例2:打家劫舍(198)
      • 例3:最大字段和(53)
      • 例4:找零钱(322)
      • 例5:三角形(120)
      • 例6:最长上升子序列(300)
      • 例7:最小路径和(64)
      • 例8:地牢游戏(174)
    • 剑指offer
      • 例1:连续子数组的最大和(30)
      • 例2:滑动窗口最大值(63)
    • 2019校招真题
      • 例1:牛牛找工作(1)
      • 例2:牛牛的背包问题(8)

    第十章 复杂的数据结构

    第十一章 其他:https://blog.csdn.net/qq_29966203/article/details/100658666

    • leetcode
      • 例1:倒转二进制(190)【位运算】
    • 剑指offer
      • 例1:二维数组的查找(1)【数组、智力】
      • 例2:二进制中1的个数(11)【位运算】
      • 例3:数值的整数次方(12)【代码的完整性】
      • 例4:调整数组顺序使奇数位于偶数前面(13)【代码的完整性】
      • 例5:顺时针打印矩阵(19)【画图让抽象形象化】
      • 例6:整数中1出现的次数(31)
      • 例7:丑数(33)
      • 例8:和为S的连续正数序列(40)
      • 例9:和为S的2个数字(41)
      • 例10:扑克牌顺子(44)
      • 例11:1+2+3+…+n(46)【条件与&&短路原则】
      • 例12:不用加减乘除做加法(47)【位运算】
      • 例13:构建乘积数组(50)【数组】
      • 例14:正则表达式匹配(51)【模拟】
      • 例15:表示数值的字符串(52)【模拟】
      • 例16:数据流中中位数(62)
    • 2019校招
      • 例1:被3整除(2)【数学】
      • 例2:迷路的牛牛(4)【模拟】
      • 例3:数对(5)【数学】
      • 例4:重叠矩阵(6)【数学】
      • 例5:牛牛的闹钟(7)【日期】
      • 例6:俄罗斯方块(9)【模拟】
      • 例7:瞌睡(10)【模拟】

    上面精炼出的约120道左右算法题可谓是题题经典。
    每一道题我都刷了至少3~4遍,总结出的模板能让我有十足的底气地应对所有面试题。与此同时,针对临考前这短暂时间如何高速高效抱佛脚,我将上面的算法汇总进一步浓缩再浓缩,总结了一个精简版算法总结与归纳,共50题不到。基本每一次面试前我都会花个大约半小时的时间将里面的算法模型迅速过一下脑子,保持一个代码的手(脑?)感。
    目录我就不列出来了,大家点进去看吧。每一道题已经都属于一个核心必考知识点了。
    算法总结与归纳
    https://blog.csdn.net/qq_29966203/article/details/102745404

    以及因为总结出来的题目实在太重要了,于是我又双叒叕将这些算法题打印出来了,每天背一背,快乐养乐多~
    在这里插入图片描述
    在这里插入图片描述
    我还会在每次面试完后,针对该场面试的手撕代码重新巩固与批注自己的笔记体系。所以打印出来的笔记才会密密麻麻一大片,有的地方记不下了就贴上了便利贴……

    还得多说一句,总结真的是一个非常好的学习习惯,他能够将知识真正化为己用,成为自己的东西。各位在看完一恩的资料后,一定要自己总结一份属于自己的资料,归纳出自己的模板。相信拥有一份属于自己的武林秘籍后,无论面对什么样的算法题,都能邪魅狂狷一笑“呵,就这?”

    好了,刷题的方法也说的差不多了,最后来一点我在经历过各路面试总结出的一些

    手撕代码超级好用的小tips~

    1. 首先无论有没有面试,都要保证一天刷2~3题,时间不要长,每道题最多给自己半小时。然后看题解,总结。刷不刷出来都不要太在意,关键是培养一个手感。
    2. 在面试前过一遍自己总结的核心算法题和思路,确保模版的套路是牢记于心且应用自如的
    3. 当面试官让你手撕代码时,要注意:
    4. 一定一定不要急着写!就算你题目听一半就发现这道题你刷过,也不要惊喜地直接冲上去public void main!谦虚、低调一点好吗?这个时候,你要发挥出你毕生的演技,装模作样皱眉思考一会儿,然后问问面试官自己的思路对不对,达成共识后再落笔;
    5. 敲代码的过程一定要注意工整的代码格式和书写习惯。面试过程中你敲的每一行代码都赤裸裸地暴露在面试官眼下,身材是好是坏一看就看出来了;
    6. 对于一些陌生或没有思路的题型一定不能焦虑也不能干坐着,主动地说说自己思路或与面试官讨论。面试官一般会给一些提示,这些提示往往是很关键的,而且是一个转折点。毕竟敲出来就有希望,敲不出来一般都凉凉了。

    写在最后

    面试的手撕代码,相对于你们平时参加各种比赛的算法题,最大的不同在于它要简单太多。很多人认为他难,其实并不是题目难,而是在面试这个一对一的氛围下所营造出的一种紧张、窒息的氛围会让原本你还不错的代码能力大打折扣,很多题。所以一定要保持一颗好的心态,同时要多刷题,尽量用惯性代替脑子。防止出现一些难以应对的意外。

    最后如果这篇文章对你有帮助的话,记得点一个赞或收藏~一恩姐姐祝所有点赞的小可爱都能成功上岸哟~

    在这里插入图片描述

    展开全文
  • 算法刷到最后,最后记在脑子里的不是代码,是思路,如果你有思路,那你一定能把代码写出来,你不可能记住所有的代码,唯一可以记住的是解题思路,所以怎么码代码不是一个问题,怎么解题才是一个问题,建议刷题的...

    作者 | Rocky0429
    来源 | Python空间


    大家好,我是 Rocky0429,一个曾经在 ACM 界划水多年的蒟蒻


    在“刷了几千道算法题,这些我私藏的刷题网站都在这里了!”这篇文章中,我有说过要写一篇如何刷题的文章,然而好几个月过去了,我实在没法舔着脸继续拖下去了…


    所以,我来交作业了…


    在这里插入图片描述

    我好多次在想要如何写这篇文章,试图去回想我刷题的时光,当时的种种感觉拼接起来,一次次动笔,又一次次的放弃。


    其实诸多纠结,我试图遵循常规,将这种刷题经验公式化,列个一二三四,期间穿插一些算法题来 give an example,这样好像才是真正像是经验的样子,但我总觉的哪里奇怪。


    我问自己,当年还是个小白,对刷题一无所知的我是否想要去看这样的文章,我想答案应该是不会…


    在这里插入图片描述

    所以这篇文章我可能会写成自己想写的样子,它不会教你速成,没有捷径,单纯是一个当年机缘巧合入了 ACM 的混子,有一段很长的(三年)连续刷题的时间,恰好有一点自己感想的碎碎念。


    以下仅代表个人想法…


    在这里插入图片描述


    很多人开始他的刷题之路因为各种各样的原因:进大厂、研究生复试或者参加竞赛拿牌,当然也可能是因为喜欢。其实不管你抱着何种目的开始,我希望你能一直在刷题这条路上走下去,毕竟除了提高自己解决问题和写代码的能力这种显而易见的好处,也能当作无聊时候的一种消遣…


    在这里插入图片描述


    其实随着刷题的深入,我发现刷题其实就是分为两步,第一步有思路,即知道用哪种姿势怎么解题;第二步是实现,即将你的思路转化为代码。接下来我所有的废话都是围绕这两步来展开。


    在这里插入图片描述



    0x01 有思路


    先说第一步:有思路。


    算法题刷多了,你就会发现,最后其实在你脑子里记住的不是实现这道题的代码,而是解这道题的思路。


    当我们刷了几百道几千道算法题的时候,你不可能记住每道题的代码,但是你可能知道这道题的思路,也就是出现类似“这道题我见过,我知道用这样那样的方法可以做出来”。有了思路,其实把它实现出来就是自然而然的事儿了,当然可能有人说知道了思路也不知道怎么实现,现在我先不说,这是我们下一步要讲的问题。


    在这里插入图片描述


    上面说的是我们要走到的目的地,那如何走上这条路,从而到刷题刷到思路“泉涌”呢?其实很简单,我们从小到大一直在被动习惯的四个字:题海战术。


    在这里插入图片描述


    题海战术,说白了就是多刷题,见多才能识广。


    但这里的多刷题,不是指多瞎刷题,而是有方法的去刷。至于刷题的网站我已经在文章的开头放链接了,不知道去哪找题的可以看一下。


    首先说什么是瞎刷题,就是看到一道刷一道,这是很多刚开始刷题的同学容易犯的毛病。


    有的追求数量,刷了一堆简单题,沉迷在 AC 的快感中不能自拔,在深深的自我感动中依然菜的扣脚;

    有的追求无脑,看到一道题就去网上搜答案,以为会解决问题,实则搜到了还看不懂,正好一劳永逸,给自己下了不是这块料的断言,成功的做到了开始即结束。


    别问我为什么知道,我才不会告诉你当年我就是这样…


    在这里插入图片描述


    其实怎么用正确的题海战术,在我看来,其实也还是两步,第一步多题一解,第二步一题多解。


    当然在此之前,我觉得你得先搞明白什么是时间复杂度和空间复杂度,不然不懂这些指标,你也不知道算法对于你当前题目的优劣。之前写过一篇旧文,有兴趣的可以看一下。


    循序渐进带你学习时间复杂度和空间复杂度。


    0x01-1 多题一解


    多题一解,就是把多种同类型的题先放在一起来做,也就是俗称的刷专题。下面是我当年刷题的一部分分类的截图:

    在这里插入图片描述
    在这里插入图片描述


    很多大佬说做题要追求完美,一道题来 N 种姿势,但是对于刚开始起步的同学来说,一道题带着多解的思想包袱去刷,本身就是一种负担。你很难指望初学者能一上来就一题多解,没那么多见识,脑阔里没储备那么多的算法类型,能够暴力破解且跑通就已经是烧高香了。


    在这里插入图片描述


    这里再多提一嘴,关于网上搜答案这件事,答案可以搜,但是不要上来一看题,感觉自己不会就立马搜答案,要尝试思考,多在草稿纸上写写画画,实在想不出来再去搜。


    在这里插入图片描述


    搜到的答案我不希望你去看别人的代码,按照别人的代码一步步的写出来其实本身没有多大意义,真正有意义的是别人的思路,通过别人的思路来自己实现出现,这才是最应该做的。


    这样做的好处是,你可以很快了解一种类型题目的做题方法,加深对某类算法的理解,总结出做题的套路,这算是一种抽象的概括能力。很多时候你就会发现,题目不过是在某类解决办法方面做加法减法。


    在这里插入图片描述



    0x01-2 一题多解


    其实这个不用刻意去追求一题多解的能力,刷的专题多了,碰到的题目多了,自然而然你碰到一道题的时候脑袋里就会有想法,觉的可以这样做,也可以那样做,这个时候你就可以对比不同的时间复杂度和空间复杂度,选择当前的最优解法。


    说一题多解,其实就是希望你在碰到一个问题的时候能够多想一步,一步一步再一步,不同维度不同姿势都尝试一下。刚开始这可能比较难,毕竟这涉及到一个改变,因为人都是有惰性的,毕竟只求一解比自找麻烦的求多解舒服多了…


    在这里插入图片描述


    题目见的多了你就会发现,很多时候你会碰到这种情况:A 题你有 5 种方法去解决它,改变它的某一个条件变成 B 题,作为 A 题的相似题 B,可能这个时候你照搬 A 的解法来解决 B,你只剩下 3 种或者更少的解法可以解决 B 题,如果你只会 1 种解法,刚好这种解法失效,那你就只能再另想它法。


    所以一题多解的好处也是显而易见的,就相当于你的手里多了很多的选项,选项多了不管你在面试或是其它时候,都能手里有牌可打。


    在这里插入图片描述


    在这里我又要多提一嘴,追求一题多解并不意味着“不择手段”的追求题解数量的堆叠,也就是不要过分追求所谓奇淫技巧的解法,而这恰恰是许多同学容易犯的毛病,错误的认为了奇淫技巧等于水平高超,在我看来这个除了能引来别人一句卧槽的惊讶,从而带来一点内心虚荣心的满足以外,其余的用处不大,看个热闹就得了。毕竟鲁迅先生曾经说过:“Use your best judgement”。


    在这里插入图片描述


    当然我也不是全盘否定技巧,但是你连个两三百道题都没刷完,你就在这给我讲你要技巧,我会认为你是在耍流氓…



    0x02 实现


    一道题有了思路,其实这道题的 90% 你已经解决了,把它实现出来按理来说就是自然而然的事儿了。


    在这里插入图片描述


    当然可能有同学知道了思路,但是就卡在这 10% 不知道怎么实现上,那这就是你写代码的能力问题,其实一样的,这就是不熟练,不熟练的原因就是练少了。


    其实这个问题的唯一解还是所谓的“题海战术”,多练习,唯手熟尔。


    在这里插入图片描述


    刚开始的时候不管是书上的例题,一些简单的水题或者你想实现的一个简单的东西,按照你的想法写出来或者看一遍别人怎么写的,自己再一步一步的默敲,不要怕麻烦,一定要自己动手,不要看会了,我们都知道看会了其实不是真正的会。但是慢慢当你习惯了这种方式,你的代码能力会潜移默化的变强。


    在这里插入图片描述


    别问我为什么知道,我难道要说作为一个当年上了大学半年还没写过一次超过 20 行的代码的男人,经过一个寒假以后,能切百十行代码的题?


    也太丢面儿了吧,说好的整个学霸人设呢…


    在这里插入图片描述



    0x03 第三步


    咦?不是只有两步嘛,哪来的第三步?


    嘿嘿,总得给能坚持看我说废话看到这里的同学开个小小灶不是…


    在这里插入图片描述

    其实还有两点是我想说的,而且这两点是我觉得在整个过程中最重要的。


    0x03-1 做总结


    怎么说呢,做总结这件事的好处,谁做谁知道,不信你就试试…


    在这里插入图片描述


    每道题有每道题的总结,每种类型的题有某类题的总结,千万不要怕麻烦,虽然刚开始的时候确实会很麻烦…


    每每回想起来,我最后悔的就是在我刚开始刷题的时候没有做总结。当年集训队老师告诉我们每道题做完都要把题解发布到 CSDN 上,记录自己的思路,解题方式和代码。这件事乍一听我觉得太麻烦,觉得“有这个时间我多刷道题它不香嘛”,一直当作耳旁风。


    在这里插入图片描述


    后来真正开始在 CSDN 上发题解,并不是我突然顿悟,而是集训队老师看我们太懒,强制执行,然而这个强制,在经过初期的不适以后,慢慢的让我形成了做什么都要总结记录的习惯,一下子就写了 6 年。下面是刚开始的一些截图:


    在这里插入图片描述


    习惯性梳理总结,在这个过程中重新产生更多的认识,理解更深,有更多的想法,无论后来成为 CSDN 的博客专家(Rocky0429)或者后来开始写公众号(Python空间,id:Devtogether),都是因为这种积累,我因此而获益,对我们老师感激一生。


    0x03-2 保持热情


    保持热情,不仅仅是能坚持,而要在坚持上最好能带有一点兴趣。刷题真的是一个很漫长的过程,如何在这个过程中能坚持下去真的很难做到…


    在这里插入图片描述


    我觉得你最好有一个最终的目标,这个很多开始刷题的同学肯定都有,不然没人闲着没事找事去刷题,有了最终的目标朝着这个方向去努力,同时把这个过程分成一部分一部分,比如拿刷专题来说,我这段时间刷链表,下段时间刷贪心,再下段时间刷 dp…


    将目标量化为可衡量的每一段,自己有了掌控感,一步一步的向着最终的目标前进,知道自己离着还有多远,不至于半途而废。


    拿我自己来说,当年搞 ACM,半年以后我已经准备放弃了,那段时间完全迷茫,觉得自己水平很差,没有机会去参加比赛,不可能拿到奖牌。那段时间我开始去寻找别的出路,去参加 Python 的社团,准备转去做项目。


    浑浑噩噩了一圈,最后还是回去做 ACM,一方面是不想让自己半年的努力付诸东流,对拿牌子的执念,更多的是我发现坐在那写项目和做题比起来,我更喜欢 AC 的快感。


    在这里插入图片描述



    0x04 写在之后


    以上就是我的一点点经验,其实没有什么新鲜的,有点啰嗦,也不一定能让你有什么进步。我一直觉的只要我们付出了时间和努力,开始向更好的方向迈出第一步,我们解决问题和写代码的能力就会潜移默化的提高。


    在这个过程中,收获的远比去解决问题更有成就感,当然这种感同身受更多的需要你自己在这个过程中去体验。


    可能末了整篇文章最有价值的只有四个字 - 题海战术。


    希望你在变好的路上越走越远…


    在这里插入图片描述


    另外本蒟蒻把公众号的高分原创文章整理成了一本电子书,取名《Python修炼之道》,一共 400 页!

    具体内容请戳:熬夜爆肝整理 400 页 《Python 修炼之道》,一本高分原创高清电子书送给你!

    目录如下:


    在这里插入图片描述

    现在免费送给大家,在我的公众号Python空间(微信搜 Devtogether) 回复 修炼之道即可获取。



    作者Info:

    【作者】:Rocky0429
    【原创公众号】:Python空间。
    【简介】:CSDN 博客专家, 985 计算机在读研究生,ACM 退役狗 & 亚洲区域赛银奖划水选手。这是一个坚持原创的技术公众号,每天坚持推送各种 Python 基础/进阶文章,数据分析,爬虫实战,数据结构与算法,不定期分享各类资源。
    【福利】:送你新人大礼包一份,关注微信公众号,后台回复:“CSDN” 即可获取!
    【转载说明】:转载请说明出处,谢谢合作!~

    展开全文
  • 常见算法题

    千次阅读 2022-03-07 19:35:35
    1.二分查找(简单)(重要) 13 给定有序数组 找某个数的位置 //二分查找 public class BInarySort { public static void main(String[] args) { int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12, 13,...

    1.二分查找(简单)(重要) 13

    给定有序数组 找某个数的位置

    在这里插入图片描述

    //二分查找
    public class BInarySort {
    	
    	public static void main(String[] args) {
    		int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12, 13,14,15,16,17,18,19,20 };
    		int resIndex = binarySearch(arr, 0, arr.length - 1, 12);
    		System.out.println("resIndex=" + resIndex);
    	}
    	
    		// 二分查找算法
    		public static int binarySearch(int[] arr, int left, int right, int findVal) {
    			// 当 left > right 时,说明递归整个数组,但是没有找到
    			if (left > right) {
    				return -1;
    			}
    			int mid = (left + right) >> 1;
    			int midVal = arr[mid];
    
    			if (findVal > midVal) { // 向右递归
    				return binarySearch(arr, mid + 1, right, findVal);
    			} else if (findVal < midVal) { // 向左递归
    				return binarySearch(arr, left, mid - 1, findVal);
    			} else {
    				return mid;
    			}
    		}
    }
    

    2.栈相关的题目

    2.1.有效的括号(简单)(重要 ) 2

    给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。

    有效字符串需满足:

    左括号必须用相同类型的右括号闭合。
    左括号必须以正确的顺序闭合。
    注意空字符串可被认为是有效字符串。

    示例 1:

    输入: “()”
    输出: true
    示例 2:

    输入: “()[]{}”
    输出: true
    示例 3:

    输入: “(]”
    输出: false
    示例 4:

    输入: “([)]”
    输出: false
    示例 5:

    输入: “{[]}”
    输出: true

    数据结构选择:

    1)选择map保存括号之间的对应关系:使用到put,get,containsKey

    2)选择stack来匹配对应关系:使用到push,pop,peek,empty方法

    class Solution {
        public boolean isValid(String s) {
            if(s.length()%2!=0) return false;
            if(s.equals("")) return true;
            Map<Character,Character> map = new HashMap<Character,Character>();
            map.put('(',')');
            map.put('{','}');
            map.put('[',']');
            Stack<Character> stack = new Stack<Character>();
            for(int i=0;i<s.length();i++) {
                char c=s.charAt(i);
                if(map.containsKey(c)){    
                    stack.push(c);
                } else {
                    if(!stack.empty()&&map.get(stack.peek())==c)
                        stack.pop();
                    else
                        return false;                
                }
            }
            return stack.empty();
        }
    }
    

    2.2.最小栈(简单) 3

    在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
    【要求】
    1.pop、push、getMin操作的时间复杂度都是O(1)。
    2.设计的栈类型可以使用现成的栈结构

    思考:如果只用一个栈,那么getMin的操作时间复杂为O(n),因为获取最小值需要遍历。

    设计思路:同时维护两个栈结构(系统提供的栈),一个栈就是正常的栈,另一个栈放当前的最小值,和第一个栈同步操作。
    在这里插入图片描述
    data栈正常存数据,min栈每次存的时候跟当前栈顶的数比较一下;当前数小于栈顶的数,则放入当前数,否则栈顶的数再存一次。

    public static class MyStack {
    		private Stack<Integer> stackData;
    		private Stack<Integer> stackMin;
    
    		public MyStack() {
    			this.stackData = new Stack<Integer>();
    			this.stackMin = new Stack<Integer>();
    		}
    
    		public void push(int newNum) {
    			if (this.stackMin.isEmpty()) {
    				this.stackMin.push(newNum);
    			} else if (newNum < this.getmin()) {
    				this.stackMin.push(newNum);
    			} else {
    				int newMin = this.stackMin.peek();
    				this.stackMin.push(newMin);
    			}
    			this.stackData.push(newNum);
    		}
    
    		public int pop() {
    			if (this.stackData.isEmpty()) {
    				throw new RuntimeException("Your stack is empty.");
    			}
    			this.stackMin.pop();
    			return this.stackData.pop();//返回栈顶并弹出
    		}
    
    		public int getmin() {
    			if (this.stackMin.isEmpty()) {
    				throw new RuntimeException("Your stack is empty.");
    			}
    			return this.stackMin.peek();//peek就是返回栈顶不弹出
    		}
    	}
    

    2.3.用栈实现队列(简单)

    //用数组实现栈
    public class ArrayStack {
    	private int maxSize; // 栈的大小
    	private int[] stack; // 数组,数组模拟栈,数据就放在该数组
    	private int top = -1;// top表示栈顶,初始化为-1
    	
    	//构造器
    	public ArrayStack(int maxSize) {
    		this.maxSize = maxSize;
    		stack = new int[this.maxSize];
    	}
    	
    	//栈满
    	public boolean isFull() {
    		return top == maxSize - 1;
    	}
    	//栈空
    	public boolean isEmpty() {
    		return top == -1;
    	}
    	//入栈-push
    	public void push(int value) {
    		if(isFull()) {
    			System.out.println("栈满");
    			return;
    		}
    		top++;
    		stack[top] = value;
    	}
    	//出栈-pop, 将栈顶的数据返回
    	public int pop() {
    		if(isEmpty()) {
    			throw new RuntimeException("栈空,没有数据~");
    		}
    		int value = stack[top];
    		top--;
    		return value;
    	}
    	//显示栈的情况[遍历栈], 遍历时,需要从栈顶开始显示数据
    	public void list() {
    		if(isEmpty()) {
    			System.out.println("栈空,没有数据~~");
    			return;
    		}
    		//需要从栈顶开始显示数据
    		for(int i = top; i >= 0 ; i--) {
    			System.out.printf("stack[%d]=%d\n", i, stack[i]);
    		}
    	}
    }
    

    3.链表

    在这里插入图片描述

    3.1.反转链表(简单)(重要) 52

    方法一:迭代
    假设链表为 1 \rightarrow 2 \rightarrow 3 \rightarrow \varnothing1→2→3→∅,我们想要把它改成 \varnothing \leftarrow 1 \leftarrow 2 \leftarrow 3∅←1←2←3。

    在遍历链表时,将当前节点的 \textit{next}next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。

    class Solution {
        public ListNode reverseList(ListNode head) {
            ListNode prev = null;
            ListNode curr = head;
            while (curr != null) {
                ListNode next = curr.next;
                curr.next = prev;
                prev = curr;
                curr = next;
            }
            return prev;
        }
    }
    

    3.2.环形链表(简单) 4

    方法一:哈希表
    思路及算法

    最容易想到的方法是遍历所有节点,每次遍历到一个节点时,判断该节点此前是否被访问过。

    具体地,我们可以使用哈希表来存储所有已经访问过的节点。每次我们到达一个节点,如果该节点已经存在于哈希表中,则说明该链表是环形链表,否则就将该节点加入哈希表中。重复这一过程,直到我们遍历完整个链表即可

    public class Solution {
        public boolean hasCycle(ListNode head) {
            Set<ListNode> seen = new HashSet<ListNode>();
            while (head != null) {
                if (!seen.add(head)) {
                    return true;
                }
                head = head.next;
            }
            return false;
        }
    }
    

    3.3.相交链表(简单) 7

    方法一:哈希集合
    思路和算法

    判断两个链表是否相交,可以使用哈希集合存储链表节点。

    首先遍历链表 \textit{headA}headA,并将链表 \textit{headA}headA 中的每个节点加入哈希集合中。然后遍历链表 \textit{headB}headB,对于遍历到的每个节点,判断该节点是否在哈希集合中:

    如果当前节点不在哈希集合中,则继续遍历下一个节点;

    如果当前节点在哈希集合中,则后面的节点都在哈希集合中,即从当前节点开始的所有节点都在两个链表的相交部分,因此在链表 \textit{headB}headB 中遍历到的第一个在哈希集合中的节点就是两个链表相交的节点,返回该节点。

    如果链表 \textit{headB}headB 中的所有节点都不在哈希集合中,则两个链表不相交,返回 \text{null}null

    public class Solution {
        public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
            Set<ListNode> visited = new HashSet<ListNode>();
            ListNode temp = headA;
            while (temp != null) {
                visited.add(temp);
                temp = temp.next;
            }
            temp = headB;
            while (temp != null) {
                if (visited.contains(temp)) {
                    return temp;
                }
                temp = temp.next;
            }
            return null;
        }
    }
    

    3.4.重排链表(中等) 2

    3.5.合并两个有序链表(简单) 3 。。。。

    3.6.单链表有效节点的数据(简单) 新浪

    头节点不统计
    在这里插入图片描述

    3.7.查找单链表倒数第k个节点(简单) 新浪

    方法一:顺序查找
    思路与算法

    最简单直接的方法即为顺序查找,假设当前链表的长度为 nn,则我们知道链表的倒数第 kk 个节点即为正数第 n - kn−k 个节点,此时我们只需要顺序遍历到链表的第 n - kn−k 个节点即为倒数第 kk 个节点。

    我们首先求出链表的长度 nn,然后顺序遍历到链表的第 n - kn−k 个节点返回即可

    class Solution {
        public ListNode getKthFromEnd(ListNode head, int k) {
            int n = 0;
            ListNode node = null;
    
            for (node = head; node != null; node = node.next) {
                n++;
            }
            for (node = head; n > k; n--) {
                node = node.next;
            }
    
            return node;
        }
    }
    
    展开全文
  • 2014华为校园招聘笔试算法题汇总.docx2014华为校园招聘笔试算法题汇总.docx2014华为校园招聘笔试算法题汇总.docx2014华为校园招聘笔试算法题汇总.docx2014华为校园招聘笔试算法题汇总.docx2014华为校园招聘笔试算法...
  • 求职招聘_2014去哪儿网校园招聘笔试算法题汇总.docx求职招聘_2014去哪儿网校园招聘笔试算法题汇总.docx求职招聘_2014去哪儿网校园招聘笔试算法题汇总.docx求职招聘_2014去哪儿网校园招聘笔试算法题汇总.docx求职招聘...
  • 【搞定算法】常见算法题分类总览

    万次阅读 多人点赞 2019-07-26 15:24:05
    博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:...主要的题目来源自:剑指 Offer、LeetCode、左神算法、面试、笔试、面经等等。下面按照分类记录: 说明(个人见解): 一、标注说明 ...
  • 【分类整理】面试最常考的 100 道算法题

    千次阅读 多人点赞 2021-12-27 08:17:47
    准备面试不知道该怎么刷算法题?哪些是面试高频算法题?怎么刷算法题最有效?你应该看看这篇文章。
  • 2017年12月份头条技术(实习)算法面试,三道任选其二,40分钟内bugfree撸出来,能执行
  • 如何刷算法题

    千次阅读 2021-11-14 12:09:09
    归纳总结/ (我鸽了????好久了哈哈哈,前段时间有点摆烂说实话,现在打算静下心来好好xiao习了! 以下是正文…????) 1.输出很关键 题目不是做完就完了,知识也并不是学会就完了,而是要反复用。根据我的经验,即使...
  • 自己手写的暴力算法然后抄到计算机上的,没做过输入输出测试,但是思路应该正确,大家看个思路就行
  • JavaScript算法题整理

    千次阅读 2021-09-01 15:52:18
    1.获得两个数相除的商和余数 console.log(10/3); //商:3.3333 console.log(10%3);//余数:1 //获得两个数相除的商和余数 console.log(Math.floor(10/3)); //1 3 //Math.floor(向下取整)、Math.ceil(向上取整)、...
  • 算法题刷题的一点感受和建议

    千次阅读 多人点赞 2020-06-26 10:00:00
    现在的公司在面试招聘的时候(尤其是校招),还是非常在意候选人的算法思维和代码能力的,所以面试过程中的算法题现场写代码这一环节基本是跑不掉了。但是手撕代码这一块的确是最难准备的环节,对于绝...
  • 2021滴滴笔试题算法题

    千次阅读 2021-04-11 16:04:38
    大概是:一个优秀的操作系统,应该具有一个好的分配任务的算法,现在假设 一个任务具有等待时间和执行时间,且必须在先等待后执行,而计算机每次只能执行一个任务,但可以等待多个任务,现在给你n个任务数,和任务...
  • LeetCode 算法题应该怎么刷?算法题学习路线?怎么组队刷题?有没有算法刷题群? 你是怎么入门 LeetCode 的?刷完 1000 道算法题是什么体验?大家都是怎么刷题的? 新手小白开始刷算法题应该怎么刷,注意什么?刷 ...
  • 一道广联达秋招算法题

    千次阅读 2020-07-22 21:33:52
    今天下午师兄在教研室群里发了一道热乎的广联达算法题,乍一看完全没有思路,于是实验室的小伙伴们饶有兴致地开始讨论起了这道题。 先给大家看一下题目: 题目描述 有一种排序算法定义如下,该排序算法每次把一个...
  • 【经典算法题】零钱兑换

    千次阅读 2021-12-15 21:48:34
    【经典算法题】零钱兑换 Leetcode 0322 零钱兑换 题目描述:Leetcode 0322 零钱兑换 分析 本题的考点:背包问题。 完全背包问题,amout为容量;物品体积为coins[i],价值为1。 本题和Leetcode 0279 完全...
  • 如何有效地刷算法题

    千次阅读 多人点赞 2019-06-03 08:50:00
    真爱,请置顶或星标 ... 这篇文章最早发在我团队的...我的团队鼓励每个同学都在业余时间多做算法题,特别是新人。个人认为在编程能力的提升上比做 side project 更有用,对职业发展也是如此。当然出于兴趣做的 s...
  • C语言经典算法题

    千次阅读 2021-10-19 15:44:21
    1. 有1、2、3、4个数字,能组成多少个互不相同且无重复的三位数?分别是多少? #include <stdio.h> void main(){ int i,j,k; printf("\n"); for(i=1;i<5;i++){ for(j=1;j<... p
  • 2020年专业408的算法题

    千次阅读 多人点赞 2020-09-26 00:16:40
    文章目录1 题目2 解法一(朴素算法)3 解法二 1 题目 定义三元组(a,b,c)(a,b,c均为整数)的距离D=∣a−b∣+∣b−c∣+∣c−a∣D=|a-b| + |b-c|+|c-a|D=∣a−b∣+∣b−c∣+∣c−a∣。给定3个非空整数集合S1,S2和S3,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 942,300
精华内容 376,920
关键字:

算法题