
剑指offer
文章平均质量分 56
snow_7
想当个花瓶的程序媛
展开
-
头结点的含义以及引入头结点的作用
一、概念头结点:是虚拟出来的一个节点,不保存数据。头结点的next指针指向链表中的第一个节点。对于头结点,数据域可以不存储任何信息,也可存储如链表长度等附加信息。头结点不是链表所必需的。头指针:是指向第一个结点的指针,如果链表没有引入头结点,那么头指针指向的是链表的第一个结点。头指针是链表所必需的。[注意]无论是否有头结点,头指针始终指向链表的第一个结点。如果有头结点,头指针就指向头结点。二、为何引入头结点1)对链表的删除、插入操作时,第一个结点的操作更方便如果链表没有头结点,那么头原创 2020-06-23 11:56:15 · 20799 阅读 · 7 评论 -
剑指offer-----栈的压入弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。思路:(1)建立一个辅助栈,按第一个序列中的数字依次压入栈中,这种是出栈和入栈交替进行的,所以每次在入栈一个元素后,需原创 2016-06-23 09:41:33 · 500 阅读 · 0 评论 -
剑指offer----两个链表的第一个公共节点----java实现
输入两个链表,找出它们的第一个公共结点。思路:两个有公共节点的链表,具有这样的特点:单向链表的节点的的属性有节点的值,它指向的下一个节点。所以当有一个公共节点时,不仅值相同,它们指向的下一个节点也相同,依次类推。两个有公共节点的链表,从第一个公共节点开始,直到尾节点都相同。 1--> 3-->4--> 6--->7--->1-->85--->2--->原创 2016-07-08 10:44:47 · 756 阅读 · 0 评论 -
剑指offer----包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中调用 min、push、pop的时间复杂度都为O(1)。思路:入栈:利用辅助栈,每次入栈时,如果入栈的元素大于辅助栈的栈顶元素,则辅助栈中压入与栈顶相同的元素,如果入栈的元素小于辅助栈栈顶的元素,则把该元素压入辅助栈中。这样辅助栈的栈顶元素就是栈中最小的元素。出栈:辅助栈和被辅助栈中元素个数始终保原创 2016-06-22 10:25:00 · 309 阅读 · 0 评论 -
剑指offer----第一个只出现一次的字符位置----java实现
在一个字符串(1字符串长度,全部由字母组成)中找到第一个只出现一次的字符的位置。若为空串,返回-1。位置索引从0开始。如果从头开始让每一个字符都与其后面的字符相比较,当第一个出现一次的字符,就结束程序。但是这种算法的时间复杂度是O(n^2);思路:我们可以遍历统计每个字符在字符串中出现的次数,把它保存在数组中,可以利用哈希算法,让字符的ASCII码与数组的键值保持一定的关系,数组的值用来保原创 2016-07-07 17:32:58 · 2955 阅读 · 2 评论 -
剑指offer----二叉搜索树的后序遍历----java实现
一、二叉搜索树,又叫二叉排序树,简称BST二叉排序树或者是一棵空树,或者是一棵具有下列特性的非空二叉树:(1)若左子树为空,则左子树上所有的节点关键字均小于根节点的关键字;(2)若右子树非空,则右子树上所有的节点的关键字均大于根节点的关键字;(3)左右子树本身也是一棵二叉排序树。后序遍历的顺序: 左 右 根一般在处理二叉树的遍历顺序时,先找到根节点,根据根节点把序列拆分原创 2016-07-07 16:26:57 · 384 阅读 · 0 评论 -
剑指offer----合并两个排序的链表
输入两个递增排序的链表,合并两个链表并使新链表中的节点仍然是按照递增排序的。一、合并两个链表的过程(递归)(1)从合并两个链表的头节点开始 如果链表1的头节点的值小于链表2的头节点的值,则链表1的头节点是合并后的头节点,反之,链表2的头节点是合并后的头节点。(2)剩下的节点中依然是排序的,再对比链表1和链表2,按(1)找出剩下的链表中节点的头节点以此类推,此问题就是典型的递原创 2016-06-21 15:43:21 · 427 阅读 · 0 评论 -
剑指offer----反转链表
题目:定义一个方法 输入一个链表的头节点,反转该链表并输出反转后链表的头节点为了正确反转一个链表,需要调整链表每个节点对下一个节点的指向。思路:(1)把当前节点的下一个节点保存起来 当前节点的next指向它前一个节点之前要把它的后一个节点保存起来。因为后一个节点只能通过当前节点的next找到,如果不提前保存起来,当前节点的next指向它的前一个节点后,它后面的节点将失去引用找不到了。原创 2016-06-21 10:45:54 · 380 阅读 · 0 评论 -
剑指offer----树的子结构----java实现
输入两颗二叉树A,B,判断B是不是A的子结构。思路:(1)在树A中找到和数B的根节点相同的节点; 可以利用前序遍历A树中的节点,找到和B树的根节点相同的节点。(2)在树A中找到和树B根节点相同的节点设为R; 再对比节点R在树B中的左孩子和右孩子是否和树B中的节点相同。 如果R节点的值和树B中的节点的值不同,则不是子结构,如果相同,递归去判断他们的各自的左孩子原创 2016-07-07 09:36:13 · 1249 阅读 · 1 评论 -
剑指offer----之字形打印二叉树
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:(1)如果每层都是从左到右一次打印这样只需要一个队列,在访问当前节点时,把当前节点的孩子存入队列就可以实现。(2)现在奇数层出队顺序是正确的,偶数层的话就是队列反过来的顺序,所以依然用队列在每一层出队节点,如果左右孩子存在,入队节点的左右原创 2016-07-19 10:22:43 · 853 阅读 · 0 评论 -
剑指offer---- 圆圈中剩下的数----java实现
经典解法:(1)模拟一个循环数组,一共n个人,从零开始编号,设置一个变量i记录已经走过的编号,当编号i==n时,就将其值置为1,从而模拟出一个首位相连的环形数组。(2)从0开始报号,报到第m-1的时候出列该位置的人,设置变量step,当step==m-1时,就数组对应值设为true,下次跳过此位置的人。(3)因为要找到数组最后剩下的那个人,也就是要让n-1个人出列,那么设置一个变量并赋原创 2016-07-19 11:26:32 · 723 阅读 · 0 评论 -
剑指offer----二叉树中和为某一值的路径----java实现
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路:对于树的遍历一般就是深度遍历和广度遍历下四种中的一种,从根节点往下找到叶节点形成一条路径,若是和为给定的值这个路径便是需要找的路径,从根节点到叶节点边访问边相加判断可以采用前序遍历。(1)若根节点的值大于给定的值或者根节点为空,则清空路径;原创 2016-07-19 17:25:36 · 3149 阅读 · 0 评论 -
剑指offer----字符串的全排列----java实现
字符串的全排列采用递归的思想:把需要全排列的字符串分为两部分看待:(1)字符串的第一个字符;(2)第一个字符后面的所有字符;求所有可能出现在第一个位置的字符;将第一个字符和后面的字符一次交换;固定第一个字符,对第一个字符后面的所有字符求全排列。第一个字符后面的所有字符又可以分为两部分;import java.util.ArrayList;import java.util.原创 2016-09-07 14:33:12 · 5122 阅读 · 0 评论 -
剑指offer----和为S的连续正数序列----java实现
输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15;所以打印出三个连续序列1~5,4~6,7~8;思路:从递增数组中两个何=和为s的数得到启示,我们也可以设置两个指针,一个指向当前序列的最小的数,一个指向当前序列最大的数。1)设置两个指针,一个为small指向当前正数序列中最小的数,一个为big指向当前正原创 2016-08-15 12:48:23 · 3555 阅读 · 1 评论 -
剑指offer----和为S的两个数----java实现
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 分析要求:(1)数组是递增的数组;即数据已经是有序的了。(2)输出乘积最小的一对和为S的数;和相等的情况下,两个数相差越大,乘积越小。思路:定义两个指针,一个是指向数组的起始位置变量设为low,一个指向数组的终止位置处变量设为high。1)如果和原创 2016-08-15 11:49:21 · 521 阅读 · 0 评论 -
剑指offer----链表中环的入口节点----java实现
一个链表中包含环,请找出该链表的环的入口结点。此问题包含两个步骤:(1)判断链表中是否有环(2)找出环一、1)选择快慢指针,让快指针每次走两步,慢指针每次走一步,若是单链表中有环的话,那么两个指针会相遇,即指向的相同的节点的值相等来判断。2)当相遇的时候,慢指针在环中走了k步,设环之外的部分长为x,环的长度为n,则快指针一共走了 x+m*n步,(m为快指针在环中走的圈数),原创 2016-08-11 11:54:01 · 4808 阅读 · 3 评论 -
剑指offer----左旋转字符串----java实现
对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。思路:(1)借助于单词翻转的顺序地思路,把字符串的部分左移,可以把字符串看成两部分,要左移的n位分为一部分,剩下的分为一部分1)先翻转第一部分2)翻转第二部分3)整体翻转当字符串的场地小于等于要左旋的位数时,不需要旋转原创 2016-08-15 17:00:39 · 2831 阅读 · 1 评论 -
剑指offer----翻转单词顺序列----java实现
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路:(1)先翻转整个句原创 2016-08-15 16:35:39 · 2759 阅读 · 0 评论 -
剑指offer----丑数
题目:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。(1)一个数m是另外一个数n的因子,是指n%m == 0. 丑数:假如n是丑数则n = 2^x * 3^y * 5^z (x>=0 ,y>=0, z>=0)方法一:遍历法原创 2016-06-23 16:22:04 · 452 阅读 · 0 评论 -
剑指offer----求1+2+3+...+n----java实现
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。求1+2+3+...+n此题可以采用短路与&&;就是只有前一个条件满足才可以去判断第二个条件。递归的出口就是n=0时,当n>0是每次都会执行&&之后的表达式sum += Sum_Solution(n-1); public int S原创 2016-07-19 17:34:47 · 846 阅读 · 0 评论 -
剑指offer----连续子数组的最大和----java实现
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?利用动态规划思路原创 2016-07-17 23:52:06 · 2250 阅读 · 0 评论 -
剑指offer----字符流中第一个不重复的字符----java实现
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。思路:第一个不重复的字符 两个关键点 不重复也就是出现一次,第一个也就是找到将其返回原创 2016-07-17 21:17:55 · 2165 阅读 · 2 评论 -
剑指offer----用两个栈实现队列
用两个栈实现一个队列,分别完成在队列尾部插入节点和在队列头部删除节点的功能思路:(1)队列是一种“先进先出”的数据结构,而栈是“先进后出”的数据结构,现在要用两个栈实现队列的出队和入队功能。(2)栈1用来入队,那么先入队的元素在栈的栈底,出队时,栈底元素得先出来。(3) 入队:让栈1用来入队,所有需要入队的元素都压入栈1 出队:(1)若栈2为空,则把栈1中的元素弹原创 2016-06-20 16:11:11 · 324 阅读 · 0 评论 -
剑指offer----从上到下打印二叉树----java实现
题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:其实就是二叉树的层次遍历问题,借助于队列来实现对二叉树的层次遍历代码:import java.util.ArrayList;import java.util.LinkedList;/*class TreeNode { int val = 0; TreeNode left = null; Tr原创 2016-07-05 09:56:21 · 1176 阅读 · 0 评论 -
剑指offer---二叉树的镜像---java实现
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7原创 2016-07-04 20:23:10 · 4705 阅读 · 0 评论 -
剑指offer----重建二叉树---java实现
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:根据先序遍历数组,可以得到树的根节点,根据得到的根节点,去中序数组中找到相应的根节点,因为中序的遍历顺序是左--根--右,可以得到根节点的左子树和右原创 2016-07-04 17:29:39 · 2332 阅读 · 4 评论 -
剑指offer----O(1)时间删除给定链表中的节点
如果从头开始遍历,遍历到给定节点的前一个节点,让它的前一个指向它的下一个,该节点指向为空,就把该节点删除掉了,但是这个时间复杂度为O(N);思路:既然是给出了一个链表中的节点,我们可以根据这个节点的next属性找到它的下一个节点,让该节点的值和next都等于下一个节点的值和next就达到对下一个节点的复制,该节点的值和next都被覆盖掉了,然后把删除它的下一个节点,也就达到对给定节点的删除。原创 2016-07-14 16:30:15 · 388 阅读 · 0 评论 -
剑指offer----旋转数组的最小数字----java实现
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。如果直接遍历数组,时间复杂度为O(n),可以利用旋转数组的特性来解决此题;思路:(1)如果发生旋转,前面的原创 2016-07-14 15:34:09 · 10070 阅读 · 2 评论 -
剑指offer--空格替换
空格替换请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。问题1:将空格替换成字符串,字符串将边长。若要是在原来的字符串上做替换,则保证字符串后面有足够的剩余空间。问题2:若从头到尾的方向去替换,则每遇到一个空格,这个空格后面所有的字符都得向后移动两位,有的字符会被多次移动。解决原创 2016-06-19 17:09:45 · 366 阅读 · 0 评论 -
剑指offer----从尾到头打印链表
思路一:链表遍历的顺序是从头到尾,但是要求输出时是从尾到头。这可以借助栈来实现,每遍历到一个节点的时候将其压入栈中。当遍历完以后再从栈中将节点的值一一取出存放到arraylist中。从栈中先取出来的是原来链表最后的节点,这样就实现了从尾到头的打印。/*** public class ListNode {* int val;* ListNode nex原创 2016-06-20 09:41:26 · 273 阅读 · 0 评论 -
剑指offer----调整数组顺序使奇数位于偶数前面----java实现
调整数组顺序使奇数位于偶数前面调整数组顺序使奇数位于偶数前面(1)相对位置可以改变,使用快排的思想, 从前往后找偶数,从后往前找奇数并交换。public void reOrderArray(int array[]) { if(array == null) return; int low = 0; int high = array.leng原创 2016-07-12 10:09:54 · 673 阅读 · 0 评论 -
剑指offer----最小的k个数----java实现
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路:如果对数组按照从小到大重新排序,那么前k个就元素就是最小的,但是时间复杂度高;可以利用快排的思想,选数组的第一个位置的数作为分界值,第一次排序后,分界点为low(1)如果low>k-1;low之后的数,都比low位置的数大,最小的k个数在low之前,只需要原创 2016-07-16 17:15:44 · 598 阅读 · 0 评论 -
剑指offer----二叉树的深度----java实现
二叉树的深度二叉树的深度可以利用递归来解决,如果根节点不为空,先得到它的左子树和右子树的深度,用左右子树中深度较大的那个加一就是整个树的深度;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) {原创 2016-07-16 17:47:49 · 386 阅读 · 0 评论 -
剑指offer----二维数组中的查找的解析与实现
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解析: (1)该数组是有序的 从左到右 从上到下 都是递增的 这是问题的关键 (2)从左下角或者右上角查找 从左下角查找:target比当前元素大,右移。 target比原创 2016-06-14 15:49:10 · 517 阅读 · 0 评论 -
剑指offer----二叉搜索树与双向链表----java实现
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:将二叉搜索树转换成一个排序的双链表,利用二叉搜索树的特性,非空二叉树的左子树上的节点的值都比根节点的值小,右子树上的节点的值都比根节点的值大,利用搜索二叉树的中序遍历得到的就是一个排序的序列;双链表不仅要指向它后面的节点还要指向它前面的节点,所以需要一个引用原创 2016-07-17 16:52:24 · 1368 阅读 · 0 评论 -
剑指offer----二叉搜索树的第K个节点----java实现
思路:根据二叉搜索树的特点来解决,非空二叉搜索树是左子树上的所有节点比根节点小,右子树上的所有节点比根节点大,其左右子树同样遵循这个规则。所以二叉搜索树的中序遍历结果,就是一个按照从大到小的顺序排序的序列,访问第K个节点时就终止程序即可。TreeNode KthNode(TreeNode pRoot, int k) { if(pRoot == null ||原创 2016-07-16 21:45:23 · 2271 阅读 · 0 评论 -
剑指offer----把二叉树打印成多行----java实现
利用层次遍历的算法,设置变量last指向当前层的最后一个节点,设置变量count记录当前层已经访问的节点的个数,当count等于last时,表示该层访问结束。层次遍历在求树的宽度、输出某一层节点,某一层节点个数,每一层节点个数都可以采取类似的算法。树的宽度:在树的深度算法基础上,加一个记录访问过的层节点个数最多的变量max,在访问每层前max与last比较,如果max比较大,max不变,如原创 2016-07-16 20:55:59 · 2071 阅读 · 0 评论 -
剑指offer----二进制中1的个数----java实现
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路一:移位运算 右移:右移n位,最右边的n位会被舍弃,如果是无符号的话,用0填补最左边的n位,如果是有符号的,用1填补坐左边的n位。若是有符号的右移,则每次会在左边补1,会造成死循环。所以右移不可取。左移:左移n位,用0填补最右边的n位,若最高位是1则,n为负数,左移一位后n要是大于零,则此位置上是0;每次判断最右边原创 2016-07-06 10:22:04 · 581 阅读 · 0 评论 -
剑指offer----链表中倒数第K个结点
输入一个链表,输出该链表中倒数第K个结点。从1开始计数,即该链表的尾节点是倒数第一个结点。思路:一、链表是单向链表,只能从头结点往后依次遍历,倒数第K个结点,也就是从头结点开始的n-(k-1)个结点。但是需要先遍历一遍得到链表长度,然后在找第n-k+1的K结点。二、(1)方法一需要对链表进行二次遍历,如果我们使用两个指针,让走快的指针走到最后一个结点的时候走的慢的指针刚好走到倒数第原创 2016-06-20 11:31:20 · 334 阅读 · 0 评论 -
剑指offer----斐波那契数列的实现--递归和迭代
1、定义斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,…这个数列从第三项开始,每一项都等于前两项之和。在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),2、递归实现 递归满足2个条件: 1)有反复执行的过程(调用自身)2)有跳出原创 2016-06-13 21:44:50 · 586 阅读 · 0 评论