剑指offer
tiny_Firefly
为你明灯三千,为你花开满城
展开
-
剑指offer刷题14 复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路之所以叫复杂链表是因为,和普通的链表相比,他除去一个next指针,还有一个随机指针,指向一个随机的结点。可以先按照next指针把这些链表中的元素串起来,然后开始遍历链表,为每一个元素的random指针赋值,对于这个指针,因为是随机的,不太好找,所以我另设原创 2020-11-01 19:05:17 · 99 阅读 · 0 评论 -
剑指offer刷题13 顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.解题思路这道题的标签是较难,但好像也没有较难的地方,就是按照顺时针的顺序遍历数组,然后输出。我把顺时针转的一个圈看成一个循环,每一趟循环又分成四个小循环,分别是上边一行,右边一列,下边一行,左边一列,判断好这些边界关系即可我遇原创 2020-11-01 18:51:47 · 115 阅读 · 0 评论 -
剑指offer刷题12 数组中重复的数
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中第一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。返回描述:如果数组中有重复的数字,函数返回true,否则返回false。如果数组中有重复的数字,把重复的数字放到参数duplication[0]中。(ps:duplication已经初始化,可以直接赋值使用。)解题思路这道题题目原创 2020-11-01 18:34:17 · 120 阅读 · 0 评论 -
剑指offer刷题11 最小的k个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。解题思路因为牛客网这里对时间复杂度这里没什么要求,不像leetcode要求那么严格,本来我是想把整个数组按照复杂度排序,然后取前k个数。排序肯定是按照排序算法来的,冒泡排序(一趟)就是选出最大或最小的数,正巧这道解题关键就在冒泡排序。我遇到的问题之前用冒泡排序都是按从小大大排的,这次要取最小的数,自然是按照从大到小排,从第一个数开始,一次比较,遇到比它大的数就交换,这样原创 2020-11-01 18:18:32 · 121 阅读 · 0 评论 -
剑指offer刷题10 合并两个排序的链表
这道题绝对算是数据结构的经典题型了,之前备考的时候就已经写过无数次了,但之前都是手写的,实际运行起来还是会发现很多问题题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。要求:时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M知识点:链表解题思路两个链表从头开始比较,从小到大依次插入到排序链表中,这里要注意插入时新建结点然后插入到新链表中具体方法:设置指向两个原链表的指针,从头开始遍历,分别比较两个链表中对应的原创 2020-06-29 15:46:19 · 108 阅读 · 0 评论 -
剑指offer刷题9 链表中倒数第k个结点
看题就知道了,这道题就是寻找倒数第k个结点,题目很简单,而且我做题的速度也越来越快了,有一点点开心题目描述输入一个链表,输出该链表中倒数第k个结点。要求:时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M知识点:链表解题思路首先判断链表中是否有k个结点,如果直接数小于k,直接返回空,否则遍历链表,找到倒数第k个结点并返回具体做法:从头到尾遍历链表,并设置计数器,求出链表长度,判断结点个数,不满足直接返回NULL,然后在从头开始遍历,寻找第(length-k+原创 2020-06-28 12:15:34 · 102 阅读 · 0 评论 -
剑指offer刷题8 两个链表的第一个公共结点
这道题重点在理解题意,牛客网的标签是难度中等,二星,其实只要题意理解清楚了就很简单问题描述输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)要求:时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M知识点:链表解题思路做这道题需要知道的两点:公共结点,并不是说当前结点相同,而是从此结点开始到链表结尾的一串子链表都一模一样链表是有序的,且为递增排列,这是题目中隐含的,通过给的测试原创 2020-06-27 13:26:25 · 106 阅读 · 0 评论 -
剑指offer刷题7 从尾到头打印链表
这道题连牛客网给的标签都是简单,一星,真的很简单,与其说知识点tag是链表,不如说是数组vector,我写代码全程只有十分钟,然后提交一次就ac了,第一次提交就通过了全部的测试的用例,虽然这道题简单,但还是有点小开心鸭题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。要求:时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M解题思路遍历链表,读取结点中的数据,放到数组中,因为是倒序打印,本来我想的是设置两个数组,一个先顺序存放从链表中读出来的数原创 2020-06-26 11:51:25 · 114 阅读 · 0 评论 -
剑指offer刷题6 反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。要求:时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M牛客网给的标签是中等难度,二星,本来昨天时间很晚了,我就想挑一道简单的,这道题是我现在练的链表专题里通过率最高的,结果昨天出了点小问题,今天才做出来解题思路整体思路就是遍历链表,然后修改当前指针的next域,指向它在原链表中的前驱结点。这里画了一张图具体实现方法是:设置三个指针,原链表中的当前指针cur,指向当前结点的前驱结点的指针p,以及指向后继结点的原创 2020-06-25 12:46:35 · 146 阅读 · 0 评论 -
剑指offer刷题5 删除链表中重复结点
这道题牛客网给的难度是三星,较难,其实我觉得解题思路也没有很难,只是有一些细节需要注意题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5要求:时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M解题思路这道题的本质就是遍历链表,删除链表中的重复结点,注意不是去重,而是只要重复就删去,相当于原创 2020-06-23 22:28:10 · 122 阅读 · 0 评论 -
剑指offer刷题4 构建乘积数组
这几天特意挑的简单的题,目前都是数组相关的,这道连牛客网给的tag都是难度为一星,我连写带改bug总共也用了20分钟不到,是真的很简单题目描述给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)要求:时间限制:C/C++ 1秒,其他语原创 2020-06-16 15:51:09 · 132 阅读 · 0 评论 -
剑指offer刷题3 和为s的两个数字
这道题思路非常简单,对时间复杂度也没有过多的要求,是属于简单题吧,但还是要记录一下成果题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M。解题思路采用数组遍历的方法,由于数组是递增排列的,这里会有一个判断技巧,要找的数的位置肯定小于给的数,且只需要判断当前两个数字的和大于给定数时不满足条件直接放弃,转向下一组,这样可能会稍微节省一原创 2020-06-15 17:26:27 · 86 阅读 · 0 评论 -
剑指offer刷题2 空格替换
问题描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。要求:时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M解题思路为了减少复杂度,字符从后往前移动,首先数出空格数,将末尾的字符依次后移相应的位数,当判断到当前字符时空格时,直接补上%20,进...原创 2020-04-21 00:12:49 · 4960 阅读 · 0 评论 -
剑指offer刷题1 二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。要求:时间限制:C/C++ 1秒,其他语言2秒;空间限制:C/C++ 32M,其他语言64M解题思路这道题就是很简单的二维数组的查找,但是注意时间限制,时间复杂度太高的也通过不了,期间我尝试了...原创 2020-04-12 20:20:01 · 198 阅读 · 0 评论