
剑指offer
文章平均质量分 62
coolgwayne
这个作者很懒,什么都没留下…
展开
-
厚积薄发打卡Day111:堆栈实践(一)<数组模拟堆栈、链表模拟堆栈、洗牌与发牌的过程>
堆栈实践(一)原创 2023-01-01 23:30:36 · 332 阅读 · 0 评论 -
厚积薄发打卡Day110:链表(九)排序的循环链表
厚积薄发打卡Day110:链表(九)<排序的循环链表>排序的循环链表问题:在一个循环链表中节点的值递增排序,请设计一个算法在该循环链表中插入节点,并保证插入节点之后的循环链表仍然是排序的。例如,图4.15(a)所示是一个排序的循环链表,插入一个值为4的节点之后的链表如图4.15(b)所示。实现/** * 排序的循环链表 */public class SortedCycleNodeList { public static ListNode insert(ListNod原创 2021-12-31 23:48:08 · 360 阅读 · 0 评论 -
厚积薄发打卡Day109:链表(七)回文链表
厚积薄发打卡Day109:链表(七)<回文链表>回文链表问题:如何判断一个链表是不是回文?要求解法的时间复杂度是O(m),并且不得使用超过 O(1)的辅助空间。如果一个链表是回文,那么链表的节点序列从前往后看和从后往前看是相同的。例如,链表A的节点序列从前往后看和从后往前看都是 1、2、3、3、2、1,因此这是一个回文链表。链表A:1->2->3->3->2->1思路对半分反转比较实现/** * 回文链表 */public class原创 2021-12-31 23:38:03 · 236 阅读 · 0 评论 -
厚积薄发打卡Day108:链表(六)重排链表
厚积薄发打卡Day108:链表(六)<重排链表>重排链表问题;给定一个链表,链表中节点的顺序是L0–>L1–>L2–>…->Ln,请问如何重排链表使节点的顺序变成 L0–>Ln–>L1–>Ln-1–>L2–>Ln-2… 例如,输入链表(a),重排之后得到链表(b):输入:1->2->3->4->5->6输出:1->6->2->5->3->4思路对半分反转后半部分原创 2021-12-31 23:32:53 · 276 阅读 · 0 评论 -
厚积薄发打卡Day107:链表(五)链表中的数字相加
厚积薄发打卡Day107:链表(五)<链表中的数字相加>链表中的数字相加题目:给定两个表示非负整数的单向链表,请问如何实现这两个整数的相加并且把它们的和仍然用单向链表表示?链表中的每个节点表示整数十进制的一位,并且头节点对应整数的最高位数而尾节点对应整数的个位数。例如,在链表(a)和链表(b)中,两个链表分别表示整数123和 531,它们的和为654,对应的链表(c)所示。a: 1->2->3b: 5->3->1c: 6->5->4思原创 2021-12-31 23:22:42 · 283 阅读 · 0 评论 -
厚积薄发打卡Day106:链表(四)反转链表
厚积薄发打卡Day106:链表(四)<反转链表>反转链表反转一个单链表。输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL实现非递归:public class ReverseNodeList { public static ListNode reverseNodeList(ListNode head) { ListNode prev = null原创 2021-12-31 23:08:47 · 255 阅读 · 0 评论 -
厚积薄发打卡Day105:链表(三)两个链表的第1个重合节点
厚积薄发打卡Day105:链表(三)<两个链表的第1个重合节点>两个链表的第1个重合节点输入两个单向链表,请问如何找出它们的第1个重合节点。例如,图中的两个链表的第1个重合节点的值是4。思路整体思路,从两个链表的相对同一位置出发遍历,得到首个相同的节点即为重合节点上图输入了:链表1:1->2->3->4->5->6链表2:7->8->4->5->6因为存在输入的两个链表长度不一致的情况,所以需要一定的校验:将原创 2021-12-31 22:53:34 · 591 阅读 · 0 评论 -
厚积薄发打卡Day104:链表(二)<链表中的环的入口节点>
链表中的环的入口节点如果一个链表中包含换,那么应该如何找出环的入口节点?LeetCode题目:给定一个链表,若其中包含环,请找出该链表的环的入口节点,否则,输出null。如上图,环的入口节点为3思路野路子:如果想要实现循环链表,那么必定在单链表的最后重新添加一个原有的节点,那么可以借助set结构对节点进行遍历去重,得到重复的节点就是为环的入口节点真是平平无奇小天才正式解题:借助上题思路(厚积薄发打卡Day103:链表(一)<删除倒数第k个节点>)可以借助快慢双指针的方法来解原创 2021-12-06 10:31:16 · 139 阅读 · 0 评论 -
厚积薄发打卡Day103:链表(一)<删除倒数第k个节点>
删除节点题目:如果给定一个链表,请问如何删除链表中的倒数第K个节点?假设链表中的节点总数为N,那么1≤K≤N。要求只能遍历链表一次举例:输入如下链表a,删除倒数第2个节点之后得到链表b链表a: 1-->2-->3-->4-->5-->6链表b: 1-->2-->3-->4-->6思路如果可以遍历两次,那么这个问题就会变得简单不少:第一次遍历获取链表总结点数n(题目为例:n = 6)第二次遍历直接找出链表的第n-k个节原创 2021-11-30 14:14:00 · 635 阅读 · 0 评论 -
厚积薄发打卡Day102:哈希表(七)<最小时间差>
最小时间差给定一组范围在00:00至23:59的时间,求任意两个时间之间的最小时间差。例如,输入时间数组[“23:50”,“23:59”,“00:00”],"23:59"和"00:00"之间只有1分钟的间隔,是最小的时间差。思路题目中要求求分钟的最小时间差,计算得出一天有24*60 = 1440min,因此可以创建一个长度为1440的数组容器当作映射表,并把字符串时间存入数组中:数组下标:一天的分钟数数组的值:是否出现了这个时间接下来只要遍历容器,比较数组值为true的下标,求最小值原创 2021-11-14 23:06:21 · 310 阅读 · 0 评论 -
厚积薄发打卡Day101:哈希表(六)<外星语言是否排序>
外星语言是否排序有一门外星语言,它的字母表刚好包含所有的英文小写字母,只是字母表的顺序不同。给定一组单词和字母表顺序,请判断这些单词是否按照字母表的顺序排序。例如,输入一组单词[“offer”,“is”,“coming”],以及字母表顺序"zyxwvutsrqponmlkjihgfedcba",由于字母’o’在字母表中位于’i’的前面,因此单词"offer"排在"is"的前面;同样,由于字母’i’在字母表中位于’c’的前面,因此单词"is"排在"coming"的前面。因此,这一组单词是按照字母表顺原创 2021-11-14 22:38:03 · 168 阅读 · 0 评论 -
厚积薄发打卡Day100:哈希表(五)<变位词组>
变位词组给定一组单词,请将它们按照变位词分组。例如,输入一组单词[“eat”,“tea”,“tan”,“ate”,“nat”,“bat”],这组单词可以分成3组,分别是[“eat”,“tea”,“ate”]、[“tan”,“nat”]和[“bat”]。假设单词中只包含英文小写字母。思路1:数字映射题目中假设单词中只包含英文小写字母,因此可以创建数组来保存每个词组的单词:用质数映射到对应的26个单词用乘法运算保证每个词组拥有单词成分的唯一性最后用词组内的每个单词的映射质数乘积当key,v原创 2021-11-14 00:34:34 · 649 阅读 · 0 评论 -
厚积薄发打卡Day99:哈希表(四)<有效的变位词>
有效的变位词给定两个字符串s和t,请判断它们是不是一组变位词:在一组变位词中,它们中的字符及每个字符出现的次数都相同,但字符的顺序不能相同。例如,"anagram"和"nagaram"就是一组变位词。思路针对变位词的解析可以移步上一小节:关于变位词的解析:厚积薄发打卡Day98:哈希表(三)<字符串变位词>由于变位词与字符出现的次数相关,因此可以用一个哈希表来储存字符出现的次数:哈希表<字符,字符出现的次数>实现数组如果只考虑小写英文字母,则可以用数组模拟哈希表小写原创 2021-11-12 00:57:19 · 703 阅读 · 0 评论 -
厚积薄发打卡Day98:哈希表(三)<字符串变位词>
变位词变位词是与字符串相关算法题经常出现的概念,所谓变位词是指组成各个单词的字母及每个字母出现的次数完全相同,只是字母排列顺序不同。例如:“pots”,“stop”,“tops” 就是一组变位词.字符中的变位词输入字符串s1和s2,如何判断字符串s2中是否包含字符串s1的某个变位词?如果字符串s2中包含字符串s1的某个变位词,则字符串s1至少有一个变位词是字符串s2的子字符串。假设两个字符串中只包含英文小写字母。例如,字符串s1为"ac",字符串s2为 “decaf”,由于字符串s2中包含字符串原创 2021-11-11 00:39:08 · 489 阅读 · 0 评论 -
厚积薄发打卡Day97:哈希表(二)< 实现LRU缓存 >
题目二:请设计实现一个最近最少使用( Least Recently Used,LRU)缓存,要求如下两个操作的时间复杂度都是O(1):get(key):如果缓存中存在键key,则返回它对应的值;否则返回-1put( key, value):如果缓存中之前包含键key,则它的值设为 value;否则添加键key及对应的值 value。在添加一个键时,如果缓存容量已经满了,则在添加新键之前删除最近最少使用的键(缓存中最长时间没有被使用过的元素)。思路:先来翻译翻译题目的意思:假设这里原创 2021-11-08 00:55:48 · 304 阅读 · 0 评论 -
厚积薄发打卡Day96:哈希表(一)< 实现查删插为O(1)的容器 >
哈希表:哈希表是一种常见的数据结构,其最大有点是高效,在哈希表的插入、删除或查找元素的时候只需要O(1)的时间,因此哈希表常被用来优化时间效率。在Java中,哈希表有两个对应的类型,即HashSet和HashMap:HashMap:映射关系结构:数组+链表+红黑树(1.8+)key为set结构:不可重复value为collection结构:可重复HashSet:集合结构:HashMap的key题目一:设计一个数据结构,使得如下三个操作的时间复杂原创 2021-11-07 23:14:48 · 133 阅读 · 0 评论 -
剑指offer打卡Day22:数字在升序数组中出现的次数<从 BinarySearch 到 util.Arrays>
题目描述统计一个数字在升序数组中出现的次数。示例1输入[1,2,3,3,3,3,4,5],3返回值4解析:乍一看题目,哟吼老套路了,直接上个计数器不就完事了?但是突然想到上次做题出现的数组越界(详见 Day14中的解析)???? 得冷静一下暴力解题最简单粗暴的解决方法,遍历+计数public int GetNumberOfK(int [] array , int k) { int count = 0; for(int i = 0; i<=array.l原创 2021-02-19 15:40:06 · 268 阅读 · 0 评论 -
剑指offer打卡Day21:两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解析:这不巧了吗。刚打卡完成Stack就来了这题哈哈简而言之:Stack,栈,是一种先进后出(FILO)的数据结构举例:子弹弹夹,压栈;或者是把东西放入箱子一样,首先是取出最后放入的物品。Queue,队列,是一种先进先出(FIFO)的数据结构举例:排队,先到先得;或者像是进出隧道,依次进出。Java中Stack属于一个类,可以直接实例调用而Queue 属于原创 2021-02-02 14:02:27 · 211 阅读 · 0 评论 -
剑指offer打卡day20:从尾到头打印链表 (从 List 到 Stack )
题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。示例1输入{67,0,24,58}返回值[58,24,0,67]解析:仔细观察题目:不难发现这是考察先进后出的概念。因此我们可以用栈这种典型的FILO的数据结构借助辅助栈,遍历链表,并push到栈中,然后pop至ArrayList返回即可。详见解法一借助Stack完成之后感觉有点索然无味,好像用的太顺手反而有点没学到东西。那看看Stack中 pop 和 push 源码吧public E原创 2021-02-02 00:39:05 · 135 阅读 · 1 评论 -
剑指offer打卡Day19:替换空格(从源码看String)
剑指offer打卡Day19:替换空格(从源码看String)题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy解析:初见题目就这就这?不得不说看到题目的时候我是楞的,剑指怎么会出这么简单的算法题?特地翻了下剑指offer的书,才发现词题主要考察的是C语言的指针。用Java的话凭借其强大的类库可以轻松搞定的解法一:调用String中的replace()方法即可原创 2021-01-31 15:56:07 · 158 阅读 · 0 评论 -
剑指offer打卡Day18 栈的压入、弹出序列(重新学习 Vector 与 Stack)
剑指offer打卡Day18: 栈的压入、弹出序列题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)示例输入[1,2,3,4,5],[4,3,5,1,2]返回值false解析:栈是非常基础的一种数据结构,不过在铲屎工作中用的原创 2021-01-29 13:56:34 · 133 阅读 · 0 评论 -
剑指offer打卡Day17:合并两个排序的链表
剑指offer打卡Day17:合并两个排序的链表题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。示例输入{1,3,5},{2,4,6}返回值{1,2,3,4,5,6}解析:递归:用剑指OFFER中的解析图表示:递归过程:建立新的头节点resres.next 指向 list.val较小的链表递归调用步骤2,返回由新建的头节点建立的新数组实践出真知:TALK IS CHEAP,SHOW U MY原创 2021-01-21 22:15:43 · 120 阅读 · 0 评论 -
剑指offer打卡Day16:最小的k个数(优先队列与快速排序)
剑指offer打卡Day16:最小的k个数(优先队列与快速排序)题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。示例输入[4,5,1,6,2,7,3,8],4返回值[1,2,3,4]解析:万物皆可用暴力法破解:对数组进行判断,(判断非空与 k>input.length 或者K==0 等情况)对数组进行排序,默认排序都是从小到大进行排序遍历数组,同时记得维护非重和count计数(以k为标原创 2021-01-21 13:51:48 · 353 阅读 · 0 评论 -
剑指offer打卡Day15:矩形覆盖
剑指offer打卡Day15: 矩形覆盖题目描述我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:示例输入4返回值5解析:依照题目进行推导,并由此总结规律推导过程如图:由图中的结论不难看出这是一个斐波那契数列了,但具体是如何实现?以从n=3和n=4推导n=5的排列以从n=3和n=4推导n=5的排列不难得出结论:第原创 2021-01-15 15:07:03 · 101 阅读 · 0 评论 -
剑指offer打卡Day14:数组中只出现一次的数字
剑指offer打卡Day14:数组中只出现一次的数字题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解析:看到题目的时候确实 有点轻敌了:乍一看题目,哟吼,这不是就简单的数组计数器就可以搞定了吗?然后一顿哐哐操作写好算法与测试类:@Testpublic void ttest1() { int arr[] = {1, 1, 2, 2, 3, 4, 4, 5}; System.out.println(Arrays.toS原创 2021-01-14 22:02:05 · 148 阅读 · 0 评论 -
剑指offer打卡Day13:孩子们的游戏
题1:圆圈中最后剩下的数题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!_)原创 2021-01-14 19:25:28 · 200 阅读 · 2 评论 -
剑指offer打卡Day12:数组中重复的数字
剑指offer打卡Day12:数组中重复的数字题1:数组中重复的数字题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中第一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。返回描述:如果数组中有重复的数字,函数返回true,否则返回false。如果数组中有重复的数字,把重复的数字放到参数duplication[0]中。(ps:du原创 2021-01-12 21:36:22 · 151 阅读 · 0 评论 -
剑指offer打卡Day11:左旋转字符串
题1:左旋转字符串题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!示例1输入"abcXYZdef",3返回值"XYZdefabc"解析:实例分析:要运用题目左循环的含义:说人话就是挤出字符串中的前n位并依次拼接到原字符串后原创 2021-01-11 20:09:02 · 153 阅读 · 0 评论 -
剑指offer打卡Day10:变态跳台阶
题1:变态跳台阶题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。示例输入3返回值4解析:规律分析:台阶 : 跳法0 01 12 2 (1,2)3 4 (111,12,21,3)4 8 (11原创 2021-01-11 14:07:39 · 92 阅读 · 0 评论 -
剑指offer打卡Day09:跳台阶
题1:跳台阶题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。示例1输入1返回值1示例2输入4返回值5解析:规律总结:台阶 : 跳法0 01 12 2 (1,2)3 3 (111,12,21)4原创 2021-01-11 00:00:08 · 129 阅读 · 0 评论 -
剑指offer打卡Day_08:连续子数组的最大和
题1:连续子数组的最大和题目描述输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).示例输入[1,-2,3,10,-4,7,2,-5]返回值18说明输入的数组为{1,-2,3,10,—4,7,2,一5},和最大的子数组为{3,10,一4,7,2},因此输出为该子数组的和 18。 解析:首次看到这题时,没有注意到对 时间复杂度 的要求,立刻想到要用暴力循环的方法来求解对于数组,是求其连原创 2021-01-10 17:17:58 · 193 阅读 · 0 评论 -
剑指offer打卡day07:第一个只出现一次的字符
题1:第一个只出现一次的字符题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)示例输入"google"返回值4解析:遍历计数:对于计数问题可以用传统的count++计数,但是这样效率太低,因此可以创建数组当计数器index 保存元素, value 保存次数牛客网剑指offer算法题打卡——day04 中的用数组优化求斐波那契数原创 2021-01-07 20:37:15 · 124 阅读 · 0 评论 -
剑指offer打卡day06:两个链表的第一个公共节点
题1:两个链表的第一个公共节点题目描述输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)说明:本题目包含复杂数据结构ListNode,点此查看相关信息解析:参考:剑指Offer面试题:31.两个链表的第一个公共节点牛客网:廿半针对两个链表,主要存在长度差的变量,可以运用双指针法,来统一两个链表的长度。双指针法:创建两个指针p1和p2,分别指向两个链表的头结点,然后依次往后遍历。如果某个指针到达末尾原创 2021-01-06 21:31:13 · 128 阅读 · 0 评论 -
剑指offer打卡day05:二维数组中的查找
题1:二维数组中的查找题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例输入7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]返回值true解析:二维数组:二维数组其实是一位数组的嵌套(每一行看做一个内层的一维数组)可类似看作行和列的关系,可当作数学概念中的矩阵看待原创 2021-01-05 19:54:59 · 166 阅读 · 0 评论 -
剑指offer打卡day04:平衡二叉树&斐波那契数列
题1:平衡二叉树题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。示例输入{1,2,3,4,5,6,7}返回值true说明:本题目包含复杂数据结构TreeNode,点此查看相关信息定义TreeNode:public class TreeNode {原创 2021-01-04 20:54:29 · 655 阅读 · 1 评论 -
剑指offer打卡day03:二叉搜索树与双向链表 & 扑克牌顺子
题1:二叉搜索树与双向链表题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。说明:本题目包含复杂数据结构TreeNode,点此查看相关信息解析:双向链表:在没有特指的情况下说链表一般指代“单向链表”,只能进行单项遍历,万一不行其中有一个链接断裂,那么后面的链表数据就无法复原了。双向链表(Double LinkedList)在一个节点有两个指针变量,一个指向后面节点,一个指向前面的节点,可以双向通行。优缺点:优原创 2021-01-02 17:34:23 · 278 阅读 · 0 评论 -
剑指offer打卡day01:“求1+2+3+...+n“ & “不用加减乘除做加法“
牛客网剑指offer算法题打卡——day01题1:求1+2+3+…+n题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。示例:输入5返回值15解析:如题,如果要求1+2+3+…+n的累加,最普通的代码实现应该是:int n = new Scanner(System.in).nextInt();int sum = 0;for (int i = 0; i <= n; i++原创 2021-01-01 00:16:09 · 264 阅读 · 2 评论