剑指offer编程
文章平均质量分 70
土豆萝卜会发光
不急不躁 不快不慢 持之以恒 相信自己
展开
-
字符串替换
题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。编程思路看到这个题,我们首先想到的思路就是从左到右扫描字符串,每一次碰到空格字符就做替换。由于要把1个字符替换成3个字符,就必须把空格后面所有的字符都后移2个字节,否则就有2个字符被覆盖。假设字符串的长度是n,原创 2017-07-20 21:11:21 · 338 阅读 · 0 评论 -
树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)编程思路分为两步:1.在树A中查找和B的根节点的值一样的结点R,这实际上就是树的遍历。2.判断A中以R为根节点的子树是不是和B有相同的结构,同样用递归,如果结点R的值和树B的根结点不相同,则以R为根节点的子树和B肯定不具有相同的结点;如果他们的值相同,则递归地判断他们各原创 2017-07-24 17:15:57 · 195 阅读 · 0 评论 -
二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。编程思路如果一棵树只有一个结点,则它的深度为1;如果根结点只有左子树或只有右子树,那么树的深度为左子树或右子树的深度加1;如果既有左子树又有右子树,那么树的深度就是左右子树深度的较大值加1,这个思路可用递归的方法实现。程序代码(Java语言原创 2017-07-24 20:42:28 · 160 阅读 · 0 评论 -
平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。编程思路1.重复遍历结点多次原创 2017-07-24 20:54:35 · 173 阅读 · 0 评论 -
用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。编程思路入队列:按顺序将元素依次插入栈1,最先入队列的在栈1的底部;出队列:由于队列是先进先出,因此最先出去的是栈1最底部的元素,由于栈是后进先出,因此,只有上面的元素都出去,最底部的才能出去,这时候,就要用到栈2,把栈1中的元素逐个弹出并压入栈2,则元素在栈2中的顺序和在栈1中原创 2017-07-25 13:14:56 · 359 阅读 · 0 评论 -
包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。编程思路准备两个栈,一个是数据栈,一个是辅助栈,首先往数据栈中压入数字,然后每次把压入数据栈的数字的最小值压入辅助栈中,那么辅助栈的栈顶就一直都是最小元素。当最小元素从数据栈内被弹出来之后,同时弹出辅助栈的栈顶元素,此时,辅助栈的新栈顶元素就是下一个最小值。如下表是栈内压入3,4,2,1,之后两次原创 2017-07-25 17:11:47 · 420 阅读 · 0 评论 -
栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)编程思路建立一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈,并原创 2017-07-25 19:54:22 · 224 阅读 · 0 评论 -
斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 0 n=0 f(n) = 1 n=1 f(n-1)+f(n-2) n>1编程思路最原创 2017-08-17 11:35:39 · 282 阅读 · 0 评论 -
二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。编程思路1.把n与1做与运算,判断n 的最低位是不是1.接着把1左移一位得到2,再和n做与运算,就能判断n的次低位是不是1...这样反复左移,每次都能判断n的其中1位是不是1.该思路的循环次数为整数二进制的位数。2.把n减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制表原创 2017-08-17 16:16:55 · 183 阅读 · 0 评论 -
数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。编程思路1,1). 按照幂的定义。循环累乘。 2). 若给定的指数为负数,则返回累乘的倒数。 3). 若给定的指数为零,则返回1。 4). 底数若为零,则返回0。2.递归:n为偶数,a^n=a^n/2*a^n/2;原创 2017-08-17 17:35:51 · 197 阅读 · 0 评论 -
从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。编程思路这种按层次打印的顺序应该使用队列来实现,先打印根结点,所以从树的根结点开始,每一次打印一个结点的时候,如果该结点有子结点,则把该结点的子结点放到一个队列的末尾。接下来从队列的头部取出最早进入队列的结点,重复前面的打印操作,直至队列中所有的结点都被打印出来为止。原创 2017-07-25 21:22:27 · 199 阅读 · 0 评论 -
旋转数组中的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0编程思路旋转后的数组可划分为两个排序子数组,而且前面的数组元素都大于或等于后面的数组元素,并原创 2017-08-06 17:24:33 · 184 阅读 · 0 评论 -
删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5编程思路定义四个结点,当前节点node,前结点pre,后结点next,要删除的结点ToBeDel,判断当前结点的值和后结点的值是否相等,若不相等,继续向前移动,若相等,删除该结点,即next =原创 2017-08-23 17:52:30 · 258 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。编程思路使用前序遍历从根节点到叶结点找到一条路径,若路径之和等于给定的值,则这条路径即为要找的路径,具体实现如下:若根节点为空或根结点的值大于给定的值,则清空路径;若根节点的值等于给定的值,则要判断该结点是否是叶子结点,原创 2017-07-24 15:27:13 · 164 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。编程思路在后序遍历得到的序列中,最后一个数字是树的根节点的值,数组中前面的数字可以分为两部分,第一部分是左子树结点的值,他们都比根节点的值小,第二部分是右子树结点的值,他们都比根节点的值大。因此,对于给定数组,先找到最后一个数作为原创 2017-07-24 13:40:33 · 159 阅读 · 0 评论 -
二维数组中的查找
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。编程思路首先选取二维数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说,如果要原创 2017-07-20 21:06:18 · 264 阅读 · 0 评论 -
合并两个排序数组
题目描述有两个排序数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2.实现一个函数,把A2中的所有数字插入到A1并且所有的数字是排序的。编程思路从尾到头比较A1和A2中的数字,并把较大的数字复制到A1的合适位置。程序代码(Java语言)package 合并两个数组;public class Test { public static原创 2017-07-21 10:10:46 · 478 阅读 · 0 评论 -
从头到尾打印链表
题目描述输入一个链表,从尾到头打印链表每个节点的值编程思路 1.用递归实现要实现反过来输出链表,所以每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点自身。2.用栈实现 先要遍历一遍链表,遍历的顺序是从从头到尾,而输出的顺序是从尾到头,也就是第一个遍历的结点最后后一个输出,最后一个遍历的结点第一个输出,即满足栈的”先进后出“。所以用栈实现,每经过一原创 2017-07-21 11:26:25 · 345 阅读 · 0 评论 -
在O(1)时间删除链表结点
题目描述给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。编程思路首先要分析要删除的结点所在的位置,一共有三种可能:头结点(链表只有一个结点),尾结点,中间结点。如果链表只有一个结点,则删除链表的头结点(也是尾结点),就需要把链表的头结点设置为NULL。如果链表有多个结点,要删除尾结点时,就需要从链表的头结点开始,顺序遍历得到该结点的原创 2017-07-21 16:01:49 · 489 阅读 · 0 评论 -
求链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。编程思路由于单链表的结点只有从前往后的指针,没有从后往前的指针,因此,只能从链表头结点开始遍历。假设链表有n个结点,则倒数第k个结点就是从头结点开始第n-k+1个结点。为了实现只遍历一次就能找到倒数第k个结点,需要定义两个指针,第一个从链表的头指针开始遍历向前走k-1,第二个指针不动;从第k步开始,第二个指针也开始从链表的头原创 2017-07-21 17:45:33 · 213 阅读 · 0 评论 -
反转链表
题目描述输入一个链表,反转链表后,输出链表的所有元素。编程思路为了防止反转后的链表出现断裂,一共定义3个指针,分别指向当前遍历到的结点,它的前一个结点和后一个结点。要实现反转,就需要调整链表中指针的方向。当我们在调整结点i的指针时,需要把i的next指向它的前一个结点h,同时,还要事先有一个结点j保存i,以防止链表断开。调整之后会发现,链表的头结点就是原始链表的尾结点。原创 2017-07-21 20:28:01 · 192 阅读 · 0 评论 -
合并两个排序链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。编程思路两个有序链表1和2,如果1是空链表,则合并后就是链表2,如果2是空链表,则合并后就是链表1,若两个都是空链表,则合并后也是空链表。合并链表1和2,先从他们的头结点开始,若1的头结点的值小于2的头结点的值,则1的头结点就是合并后链表的头结点,接着继续合并两个链表原创 2017-07-21 22:06:35 · 218 阅读 · 0 评论 -
两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点编程思路1.在第一个链表上顺序遍历每一个结点,每遍历到一个结点的时候,在第二个链表上顺序遍历每一个结点。如果在第二个链表上有一个结点和第一个链表上的结点一样,说明两个链表在这个结点上重合,便找到了他们的公共结点。如果,第一个链表的长得为m,第二个的为n,则时间复杂度为O(mn).2.如果两个单向链表有公共结点,那么该结点原创 2017-07-22 08:51:47 · 211 阅读 · 0 评论 -
圆圈中最后剩下的数字(约瑟夫环问题)
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去原创 2017-07-22 11:21:50 · 246 阅读 · 0 评论 -
二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。编程思路在搜索二叉树中,左子结点的值总是小于父节点的值,右子节点的值总是大于父节点的值,因此,在转换成排序双向链表时,原先指向左子结点的指针调整为链表中指向前一个结点的值,原先指向右子节点的指针调整为链表中指向后一个结点的指针。先中序遍历树中的每原创 2017-07-22 14:36:50 · 198 阅读 · 0 评论 -
复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。编程思路1.很直观的解法就是分成两步:1).复制原始链表上的每一个结点,并用next指针连起来。 2).复制random指针原创 2017-07-22 16:28:49 · 240 阅读 · 0 评论 -
重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。编程思路首先,根据给出的前序遍历和中序遍历找出根节点,即为1;然后,根据中序遍历找到左右子树的长度,根节点左边的即为左子树,右边原创 2017-07-24 10:30:11 · 154 阅读 · 0 评论 -
链表中环的入口结点
题目描述一个链表中包含环,请找出该链表的环的入口结点。编程思路定义两个指针slow和fast,第一次走,slow和fast都从头结点开始,slow每次走一步,fast每次走两步,当slow和fast相遇时,fast比slow多走 的步数就是环中的结点数。第二次走,slow还是从头结点开始,而fast从第一次slow和fast相遇的结点开始,直到slow和fast再次相遇时,原创 2017-08-23 19:23:27 · 296 阅读 · 0 评论